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)
编译器无法推断您希望将表达式转换为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)