c++ - 对非模板类型使用通用引用?

标签 c++ overloading c++20 forwarding-reference

我正在为 vector 构建一个简单的管道运算符,用户可以像这样使用它(伪代码):

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 只对右值(因为 vec 本身的类型没有推导)!但我也希望它绑定(bind)到左值。我该怎么做?

一个丑陋但实用的解决方案是为我的管道运算符(operator)制造另一个重载,但使用 std::vector<int>& .然而,这是不可扩展的,( 2 ^ n 重载 n 个参数!),我相信这就是创建通用引用的原因。

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

最佳答案

当然,您可以使用转发引用。

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);

另外,请记住,运算符通常应在与其参数之一相同的 namespace 中创建,以便 ADL 可以找到它们。但是你不能触摸 namespace std...

此外,我不喜欢重载运算符的想法,其中两个参数都不是创建的类。除非您的用户必须通过 using namespace ...; 明确选择加入这些运算符。

关于c++ - 对非模板类型使用通用引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67038825/

相关文章:

C++:使用显式关键字的编译错误

overloading - 无法在Raku中重载>>运算符

java - 多个 Super( ) 用于重载父类(super class)构造函数

c++ - 未能在 SFINAE 中将概念类型识别为 bool

c# - C# byte[] 的 C++ 模拟是什么?

c++ - 是否可以在成员例程中使用 const_cast 来避免重复代码

c++ - 如何防止通过引用返回的私有(private)结构发生突变

c++ - 为什么我需要 `std::type_identity_t` 来启用隐式类型转换?

c++ - 未在此范围内声明 C++

c++ - 如何测试一行是否为空?