我想制作一个基本的“ View ”类,该类只是对现有对象的const ref的容器,仅包含标准C++和STL。我可以做到这一点
template<typename T>
using view = vector<reference_wrapper<const T>>
它与STL的其余部分(如算法库)很好地配合使用。问题在于用户必须在此 View 中的对象上调用.get()才能做任何有用的事情(这在可用性方面很烦人)。我正在寻找一种扩展此方法的简单方法,以便访问器自动返回
const T&
而不是std::reference_wrapper<const T>
可以在不创建新的
View
类(从vector
派生并覆盖相关方法)的情况下完成此操作吗?
最佳答案
解决方案不完善。
class C {
public:
void fun() { cout << "C::fun();" << endl; }
};
template <class _Ty>
class myreference_wrapper : public _Weak_types<_Ty>::type, public _Ty { // stand-in for an assignable reference
public:
static_assert(is_object_v<_Ty> || is_function_v<_Ty>,
"reference_wrapper<T> requires T to be an object type or a function type.");
using type = _Ty;
template <class _Uty, enable_if_t<conjunction_v<negation<is_same<_Remove_cvref_t<_Uty>, myreference_wrapper>>,
_Refwrap_has_ctor_from<_Ty, _Uty>>,
int> = 0>
myreference_wrapper(_Uty&& _Val) noexcept(noexcept(_Refwrap_ctor_fun<_Ty>(_STD declval<_Uty>()))) {
_Ty& _Ref = _STD forward<_Uty>(_Val);
_Ptr = _STD addressof(_Ref);
}
operator _Ty& () const noexcept {
return *_Ptr;
}
_NODISCARD _Ty& get() const noexcept {
return *_Ptr;
}
template <class... _Types>
auto operator()(_Types&&... _Args) const -> decltype(_STD invoke(get(), _STD forward<_Types>(_Args)...)) {
return _STD invoke(get(), _STD forward<_Types>(_Args)...);
}
private:
_Ty* _Ptr;
};
template<typename T>
using view = vector<myreference_wrapper<const T>>;
int main() {
C c;
view<C>v;
v.push_back(c);
v[0].fun();
return 0;
}
class myreference_wrapper is copied from std header, just modified its inherit.
解决方案不是很好,它不能解决基本类型,但是我不能提供更好的解决方案。
实际上,我认为完美的解决方案可能不存在。
vector<reference_wrapper<const T>>::operator[]
返回reference_wrapper<const T>
类型,如何与T一样处理reference_wrapper<const T>
?嗯...也许我的知识还不够丰富。
关于c++ - 使用STL的简单 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61076209/