C++重载运算符<<除了ostream之外的其他东西

Tom*_*Tom 0 c++ templates list operator-keyword

我试图在一个课程作品上展示多样性,并希望使用<<运算符轻松地将变量添加到列表中.例如:

UpdateList<string> test;
test << "one" << "two" << "three";
Run Code Online (Sandbox Code Playgroud)

我的问题是,每个<<运算符的例子都与ostream有关.

我目前的尝试是:

template <class T> class UpdateList
{
     ...ect...

     UpdateList<T>& operator <<(T &value)
     {
          return out;
     }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道我是如何实现这一点的,或者在C++中实际上是不可能的?

For*_*veR 6

你应该用const T& value.下面的代码片段应该可以正常工作

UpdateList<T>& operator << (const T& value)
{
   // push to list
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

要么

UpdateList<T>& operator << (T value)
{
   // push to list
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

在C++ 11中(感谢rightfold)

  • 如果你打算复制元素(最有可能是这里的情况),按值取值并在内部使用`std :: move`.这样编译器可以使用`T`的移动构造函数,如果程序员传递一个临时的. (3认同)
  • @rightfold你错过了我的观点:很可能他的`add`函数定义为`void add(const T&v)`,其中`v`被复制到`add`里面的结构中.因此,通过副本传入`operator <<`将创建1个副本,然后`add`将创建另一个副本(总共2个副本).而通过引用传递给`operator <<`只会创建1个副本.为了防止多个副本问题,您需要编写一个利用移动语义的`add`版本(也就是说,也通过副本传递并在函数中获取它的所有权). (2认同)