我的意思是:
每个人都知道这种将流重定向到输出的方法:
cout << "sometext"
但是可以将该流传递给这样的函数:
my_function() << "sometext";
答案 0 :(得分:6)
是*:
#include <iostream>
#include <ostream>
std::ostream & my_function() { return std::cout; }
// ...
my_function() << "Hello world.\n";
*)你用语言说的任何内容都是完全正确的,你可能很难将其集成到你的项目中,但这个答案显示了如何让你的代码做你想做的事。
答案 1 :(得分:5)
每个人都知道这种将流重定向到输出的方法:
这不是那样做的。该流称为cout
;这是iostream对象。 <<
运算符不会重定向任何内容。 std::ostream
个对象都有重载operator<<
个函数。当您在左侧使用带有流的<<
时,会调用这些函数,而在右侧则使用某种类型的超载。
<< "sometext"
不是可以“重定向”的“流”。它甚至不是C ++中的有效表达式。 <<
运算符是二进制的。它需要两个参数。
my_function() << "sometext";
只有在返回std::ostream
类或从中派生的内容时才能工作。或者为其定义了重载operator<<
的内容以及const char*
。
答案 2 :(得分:1)
cout << "sometext"
这不是“将流重定向到输出”它使用字符串文字“sometext”调用operator <<
对象上的cout
函数
如果my_function()
返回的ostream
已operator <<
重载,那么my_function() << "sometext"
将编译其他内容会产生错误。
答案 3 :(得分:1)
如果您正在寻找一种方法来为您自己的与流无关的功能重载<<
,请按以下步骤操作:
struct MyStruct {
void DoSomething(const string& s);
};
MyStruct &operator<<(MyStruct &x, const string& s) {
x.DoSomething(s);
return x;
}
MyStruct& my_function() {
return MyStruct;
}
int main() {
my_function() << "Hello, world!";
}
在此示例中,将DoSomething
从MyStruct
返回的my_function
实例上调用"Hello, world!"
,{{1}}将作为参数传递给它。
答案 4 :(得分:0)
如果我理解你的问题,那么使用std::cout
输出的函数的shell重定向的最接近的等价物可能是暂时切换std::cout
的内部流缓冲区以用于另一个
当然,这本质上不是线程安全的,如果函数本身期望std::cout
和stdout
是相同的基础事物,则无法应对。
#include <iostream>
#include <sstream>
int main()
{
std::stringbuf redir( std::ios_base::out );
std::streambuf* save = std::cout.rdbuf( &redir );
my_function(); // cout output ends up in redir
std::cout.rdbuf( save ); // restore original cout
}