代码之家  ›  专栏  ›  技术社区  ›  SomeProgrammer

对非模板类型使用通用引用?

  •  1
  • SomeProgrammer  · 技术社区  · 5 年前

    我正在为向量构建一个简单的管道操作符,用户可以这样使用(伪代码):

    auto x = std::vector{1,2,3} | push_back(10)
                                | push_back(100)
                                ;
    

    现在我尝试这样定义管道操作符:

    template <typename T>
    constexpr inline auto& operator| (std::vector<T>&& vec, std::invocable<std::vector<T>> auto&& func);
    

    但是现在vec只适用于r值(因为vec本身的类型没有推导出来)!但我也希望它和l值绑定。我该怎么做?

    std::vector<int>& . 但是这是不可伸缩的,(n个参数有2^n个重载!),我相信这正是创建通用引用的原因。

    在这种情况下,如何使用通用引用?

    1 回复  |  直到 5 年前
        1
  •  4
  •   Barry    5 年前

    当然,你可以用转发推荐信。

    template <typename T> inline constexpr bool is_vector = false;
    template <typename ...P> inline constexpr bool is_vector<std::vector<P...>> = true;
    
    template <typename T> requires is_vector<std::remove_cvref_t<T>>
    constexpr auto &operator|(T &&vec, std::invocable<T> auto &&func);
    

    另外,请记住,通常应该在与其参数之一相同的命名空间中创建操作符,以便ADL可以找到它们。但你不能碰 namespace std ...

    另外,我不喜欢重载运算符的想法,因为两个参数都不是 你 创建。除非您的用户必须通过 using namespace ...;

    推荐文章