【问题标题】:C++ Overload operator << with something other than ostreamC++ 重载运算符 << 使用 ostream 以外的其他内容
【发布时间】:2013-10-30 13:13:31
【问题描述】:

我正在尝试展示课程作业的多样性,并希望使用

UpdateList<string> test;
test << "one" << "two" << "three";

我的问题是,

我目前的尝试是:

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

     UpdateList<T>& operator <<(T &value)
     {
          return out;
     }
}

有谁知道我如何做到这一点,还是在 C++ 中实际上不可能?

【问题讨论】:

  • 您当前的尝试收到了哪些错误消息?

标签: c++ list templates operator-keyword


【解决方案1】:

您应该使用const T&amp; value。 以下代码片段应该可以正常工作

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

UpdateList<T>& operator << (T value)
{
   // push to list
   return *this;
}

在 C++11 中(感谢 rightfold

【讨论】:

  • 如果你还是要复制元素(很可能是这里的情况),按值取值并在内部使用std::move。这样编译器可以使用T的移动构造函数,如果程序员传递一个临时的。
  • @rightfold 在这种情况下,这并没有真正给你买任何东西。您仍在创建副本,并且他的 push/add 函数很可能没有利用移动语义,因此引用将创建最少数量的副本。
  • @ZacHowland &lt;&lt; MyClass(); // no copy, only moves
  • 最好的办法是获取“通用参考”(Scott Meyers 的术语):template&lt;typename T&gt; UpdateList&lt;T&gt;&amp; operator &lt;&lt; (T&amp;&amp; value); 并使用 std :: forward 传递它。
  • @rightfold 你错过了我的意思:很可能他的add 函数被定义为void add(const T&amp; v) 之类的东西,其中v 被复制到add 内部的结构中。因此,通过复制传递到 operator&lt;&lt; 将创建 1 个副本,然后 add 将创建另一个(总共 2 个副本)。而通过引用传递到 operator&lt;&lt; 只会创建 1 个副本。为了防止多副本问题,您需要编写一个利用移动语义的add 版本(也就是说,也通过副本传递并在函数内获得它的所有权)。
【解决方案2】:

您(通常)希望将其声明为非类成员:

template<typename T>
UpdateList<T>& operator<<(UpdateList<T>& lst, const T& value)
{
    lst.add(value); // whatever your add/insert method is goes here
    return lst;
}

【讨论】:

  • 我不认为这是典型的。但也不是典型的。问题变成了你想要自动转换成 UpdateList&lt;T&gt; 的东西吗?这可能发生在这里。
【解决方案3】:

你需要在课堂之外重载operator&lt;&lt;()

template<typename T>
UpdateList<T>& operator<<(UpdateList<T>& out, const T& value)
{
    return out;
}

【讨论】:

  • 为什么运算符
  • @ForEveR 你是对的。但这是典型的用法,就像提到的来自std::ostream 的示例一样。
  • 课外不需要,但是不能修改课内容也可以这样
  • @ForEveR 你可以把它写成类成员,但由于这只是一种方便的方法,它通常不是类成员。类成员将是实际的 add 函数。
  • @ZacHowland std::ostream 接口怎么样? en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt
猜你喜欢
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多