接受 ostringstream 等参数的 c++ 函数?

Mar*_*com -1 c++ string arguments function stream

C++ 有没有办法定义一个函数,这样我就可以做这样的事情:

foo( "Error on line " << iLineNumber );
foo( "name " << strName << " is Invalid" );
Run Code Online (Sandbox Code Playgroud)

就像现在一样,我必须在调用 foo 函数之前声明一个 ostringstream 对象,如下所示:

std::ostringstream strStream1;
ostringstream1 << "Error on line " << iLineNumber;
foo( ostringstream1 );

std::ostringstream strStream2;
ostringstream2 << "name " << strName << " is Invalid";
foo( ostringstream2 );
Run Code Online (Sandbox Code Playgroud)

Fra*_*eux 6

编译器无法推断您希望将表达式转换为std::ostringstream. 您可以通过显式为参数提供 1 来解决此问题,您可以在函数中内联执行此操作:

#include <sstream>
#include <string>

void foo(std::ostringstream osstr)
{
    // Use the stream
}

int main()
{
    const int iLineNumber = 10;
    const std::string strName = "file.cpp";

    foo( std::ostringstream{} << "Error on line " << iLineNumber );
    foo( std::ostringstream{} << "name " << strName << " is Invalid" );
}
Run Code Online (Sandbox Code Playgroud)

但是,我建议使用参数包和折叠表达式来转发参数:

#include <sstream>
#include <string>
#include <utility>

// Parameter, variable number of arguments of various types
template<class ... T>
void foo(T&& ... args)
{
    std::ostringstream stream;
    // Fold expression, for each argument in args, add it to the stream
    (stream << ... << std::forward<T>(args));

    // Use the stream
}

int main()
{
    const int iLineNumber = 10;
    const std::string strName = "file.cpp";

    foo( "Error on line ", iLineNumber );
    foo( "name ", strName, " is Invalid" );
}
Run Code Online (Sandbox Code Playgroud)