【问题标题】:Does my overload of operator<< (stream insertion) with a left operand not being an ostream is valid [closed]左操作数不是ostream的运算符<<(流插入)的重载是否有效[关闭]
【发布时间】:2019-03-15 17:08:27
【问题描述】:

考虑上下文,我想写入另一个文件描述符而不是 stdout。在这里,我的“写”方法打印到标准输出,但仅用于理解。

这是我要解决的主要问题:

我有一个 write(char*) 方法,我想通过 operator

期间。

虽然,在互联网上,没有任何地方可以找到一个例子,它在左操作数上使用除了 ostream 之外的任何东西来重载 operator

编辑:这怎么可能是重复的?我很感兴趣,为什么您链接的主题以及 https://arne-mertz.de/2015/01/operator-overloading-common-practice/ 或许多其他人从不谈论除 ostream 之外的其他类型的左操作数。

EDIT2:我很难准确地回答我的问题。以下代码是一个好习惯吗,如果不是,我应该怎么做才能解决我用大写字母支撑的问题。谢谢你的回答

#include <iostream>

struct Ter {
    void write(const std::string &str) { std::cout << str; }; //Here we should do something else in our context
    friend Ter &operator<<(Ter &a, std::string &b);
};


Ter &operator<<(Ter &a, const std::string &b)
{
   a.write(b);
   return (a);
}


int main()
{
    Ter toto;
    toto << "b" << "c";
}

【问题讨论】:

  • 这取决于您希望operator&lt;&lt;Ter 的含义。在这种情况下,它看起来确实想成为std::ostream
  • 通常情况下,当你重载一个操作符时,你应该做它内置的对应操作。在 C++ 中,&gt;&gt;&lt;&lt; 是按位运算或流式处理。如果你想连接一些东西,那么使用++=
  • @stalker2106: "我敢于你在互联网上的某个地方找到一个运算符" Boost.Spirit。还有Boost.Serialization;档案are not streams。还有 Boost 的动态 bitset 类型。
  • 很难将其解读为一个明确、具体的问题。 “为什么人们总是...”他们并不总是。 “无处可寻……” 有。 “这是否意味着我的例子是一个罕见的案例......”不,这并不意味着。
  • @stalker2106:我没有将您链接到代码;我将您链接到。您可以自己在这些库中查找代码。

标签: c++ operator-overloading std


【解决方案1】:

我对您所链接的主题以及 https://arne-mertz.de/2015/01/operator-overloading-common-practice/ 或 许多其他人从不谈论其他类型的左操作数 ostream。

因为这并不重要。对std::ostream 有效的方法对其他类型也有效。抱歉,这有点像为Foo 类型重载operator+ 的示例,然后抱怨您从未获得过如何为Bar 重载它的示例。如果您希望您的类型提供operator&lt;&lt;,那么是的,您以可行的方式实现了它。

您的代码似乎是正确的。它是否做你想做的事,只有你可以决定。

【讨论】:

  • 这是一个很好的答案,谢谢。是的,我只是好奇为什么(例如在我提供的链接中)所有运算符都为 T 或 X 类型重载,并且 operator
  • @stalker 那是因为通常你确实关心右侧并且确实想为std::ostreams operator&lt;&lt;提供过载
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2020-08-08
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
相关资源
最近更新 更多