是否可以将字符串流作为函数参数传递?

rsk*_*k82 19 c++ function stringstream parameter-passing

是否可以传入一个字符串流并让函数直接写入?

我记得我看到一个类似于这样的函数被调用:

my_func(ss << "text" << hex << 33);
Run Code Online (Sandbox Code Playgroud)

eq-*_*eq- 20

当然可以.为什么不呢?此类函数的示例声明:

void my_func(std::ostringstream& ss);
Run Code Online (Sandbox Code Playgroud)

  • 除了`ss <<"test"<< hex << 33`的类型不是`std :: stringstream&`,而是`std :: ostream&`,它与给定的签名不匹配. (3认同)

das*_*ght 9

绝对!确保通过引用而不是按值传递它.

void my_func(ostream& stream) {
    stream << "Hello!";
}
Run Code Online (Sandbox Code Playgroud)

  • @aderchox 否则它将无法编译(流没有复制构造函数)。 (2认同)

Jam*_*nze 5

my_func必须有如下签名:

void my_func( std::ostream& s );
Run Code Online (Sandbox Code Playgroud)

,因为这是 的类型ss << "text" << hex << 33。如果目标是提取生成的字符串,您必须执行以下操作:

void
my_func( std::ostream& s )
{
    std::string data = dynamic_cast<std::ostringstream&>(s).str();
    //  ...
}
Run Code Online (Sandbox Code Playgroud)

另请注意,您不能使用临时流;

my_func( std::ostringstream() << "text" << hex << 33 );
Run Code Online (Sandbox Code Playgroud)

无法编译(除非使用 VC++),因为它不是合法的 C++。你可以这样写:

my_func( std::ostringstream().flush() << "text" << hex << 33 );
Run Code Online (Sandbox Code Playgroud)

如果你想使用临时的。但这对用户来说不太友好。