2010-11-06 110 views
1

我需要重载<运算符才能使用内置类型的流。对于字符串它不是一个问题,因为我只是重载这样的功能:C++重载<< operator

ostream& operator<<(ostream& os, const char* str) { /*...*/ } 

这工作,因为这个功能是全球性的,不是成员。问题是我需要为其他基本类型(int,float等)过载运算符,但这些都是成员函数。有什么办法可以做到这一点?我需要它不仅适用于cout,而且适用于其他流。提前致谢。

+5

不知道你是什么意思...''operator <<'*已经存在*用于'ostream&'和内置类型。无需超载。 'const char *'相同。 – 2010-11-06 13:49:08

+0

你的意思是,你需要有2个重载函数。一个全球和一个成员。但是,参数不同[字符串类型的全局和其他数据类型的成员函数]。对 ??? – 2010-11-06 13:52:22

+1

我知道ostream&已经有一个超载。但我必须重载它,因为我需要它的行为不同(不只是简单地打印出字符)。 – Mirko 2010-11-06 14:30:29

回答

6

您不应该尝试更改std::cout << 3;中的操作符所做的操作。它是标准API的一部分。如果您需要以某种格式输出,流操纵不能支持,那么例如,你可以写一个小包装:

struct MyFormatter { 
    MyFormatter (ostream &o) : o(o) {} 
    ostream &o; 
}; 

MyFormatter &operator<<(MyFormatter &mf, int i) { 
    mf.o << "int(" << i << ")"; // or whatever 
    return mf; 
} 

然后使用它是这样的:

MyFormatter mf(std::cout); 
mf << 1 << "," << 2 << "," << 3; 
+0

Thx为答案史蒂夫。你提到我不应该改变cout的<<运算符。问题是我应该这样做。这是一个家庭作业。其任务是编写一个基于操纵器的程序,以反转特定标签之间的内容。例如:cout << start <<“abc”<< end。现在“abc”字符串应该打印出“cba”。 “开始”和“结束”将是操纵者,但我仍然需要重载<<操作符才能使其工作。现在我已经用字符串成功完成了它,但是与其他初始类型有关。 – Mirko 2010-11-06 22:12:46

+1

@Mirko:我不认为你可以严格地用操纵器来做到这一点。一个操纵器是一个函数(或类似函数的对象),当被写入一个流时,该流被作为参数调用。他们所能做的就是在流上设置状态,'cout'只有特定的格式标志等可供操作。我怀疑你想要的是'cout << start'返回,而不是'cout',而是一个包装器。但是,如果没有看到我不确定的任务,我可能错过了一些东西。 – 2010-11-06 22:19:17

+1

无论如何,我非常确定你只是*不能*为operator <<(ostream&,int)'提供一个重载,因为它会与现有的重载模糊不清。 – 2010-11-06 22:25:43