运算符可以识别右值吗
Can an operator to recognize rvalue?
我有一些STL容器类型T
,比如template< typename F > using T = std::vector< F >;
。我想能够写以下代码:
typedef std::string F;
T< F > v(2, "a"), w(3, "b");
v += std::move(w);
std::cout << "v : ";
std::copy(std::begin(v), std::end(v), std::ostream_iterator< F >(std::cout, "|"));
std::cout << std::endl << "w : ";
std::copy(std::begin(w), std::end(w), std::ostream_iterator< F >(std::cout, "|"));
std::cout << std::endl;
并得到输出:
v : a|a|b|b|b|
w : |||
也就是说,我希望能够通过"std::move
-ing"(从<utility>
一个接一个或从<algorithm>
按范围)将源w
的所有内容附加到目标v
的末尾,这样源的所有元素都保持为空,只需要w.clear();
调用。
是否可以让操作员识别右值引用?说:
T & ::operator += (T &, T &&);
或者我还想要什么?
是的,这会起作用,但T
不是一种类型,所以不能这样写运算符。T
是一个模板,所以操作员需要像一样
template<typename U>
T<U>& operator+=(T<U>&, T<U>&&);
一种可能的实施方式是:
template<typename U>
T<U>& operator+=(T<U>& lhs, T<U>&& rvalue)
{
std::move(rvalue.begin(), rvalue.end(), std::back_inserter(lhs));
rvalue.clear();
return lhs;
}
并且对于lvalues:过载
template<typename U>
T<U>& operator+=(T<U>& lhs, const T<U>& lvalue)
{
std::copy(lvalue.begin(), lvalue.end(), std::back_inserter(lhs));
return lhs;
}
要使它适用于任何类型(我认为这是一个坏主意,应该将其限制为只匹配您想要的类型),请尝试以下操作:
template< class T, class U >
inline
typename std::enable_if< std::is_lvalue_reference< U >::value, T& >::type
operator += (T& lhs, U&& lvalue)
{ /* copy from lvalue */ }
template< class T, class U >
inline
typename std::enable_if< !std::is_lvalue_reference< U >::value, T& >::type
operator += (T& lhs, U&& rvalue)
{ /* move from rvalue */ }
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 模板类无法识别友元运算符
- 在我的类中无法识别用户定义的文本运算符
- 类的unique_copy无法识别运算符<
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- 在调用运算符重载时识别调用上下文/用法C++
- 无法识别被覆盖<<运算符
- 运算符 + 无法识别类型
- 为什么我的重载乘法运算符没有被识别
- C++无法识别3points运算符
- 如何使用dynamic_cast运算符识别失败的强制转换
- <<未找到运算符和无法识别的转义序列
- 有人可以指出为什么我的变量无法识别以及为什么我不能重载我的运算符吗
- 包含标头时,'operator Apple'不是可识别的运算符或类型
- C++识别不同的运算符=
- 运算符可以识别右值吗
- 添加新运算符或类型时 #define 不是可识别的运算符或类型