c++ - 使用STL的简单 View

标签 c++ templates stl containers c++17

我想制作一个基本的“ 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/

相关文章:

c++ - 友元的替代品?

c++ - 函数的多重定义

c++ - 如何使用模板使不必要的长代码变得紧凑

c++ - 使用 numeric_limits 作为默认参数值

c++ - 在 C++ 中使用关键字 using 声明模板化函数指针的语法

c++ - O(1) 中 unordered_set 中的随机元素

c++ - C++编程错误

c++ - 在C++中使用括号和方括号创建动态数组之间的区别

c++ - 从 vector 中删除取消引用的元素

c++ - 如何正确使用std::transform和std::mem_fn?