可以创建临时streamobject作为函数的参数吗?

时间:2013-11-15 07:47:34

标签: c++ stringstream

我有这个函数,它应该使用一个可选的流参数作为errortext打印。

void showUsage(std::wstringstream oErrortext, bool bExit, int nExitCode)
{
    if(oErrortext.rdbuf()->in_avail() > 0)
        std::wcerr << oErrortext << std::endl;

    std::wcout << gUsage << std::endl;

    if(bExit == true)
        exit(nExitCode);
}

现在,当我尝试使用单个参数调用它时,它可以正常工作:

showUsage(std::wstringstream(L"Multiple filenames for target found"), true, 10);

但是我想使用stringstream的原因是,能够构建一个字符串,而不仅仅是静态字符串。

示例:

showUsage(std::wstringstream(L"Number format for offset missing -") << oParam->mOption, true, 10);

但是我收到了编译错误。

  1. 如何创建此临时对象并使用单行流式传输参数(或者我是否必须首先创建它,以便单行无法实现)?
  2. 对于我在这里尝试做的事情有没有更好的解决方案(不要搞乱varargs)?

2 个答案:

答案 0 :(得分:2)

您可以使用string代替流:

void showUsage(std::wstring oErrortext, bool bExit, int nExitCode)
{
    if (!oErrortext.empty())
        std::wcerr << oErrortext << std::endl;
    ...
}

要使用它,请将字符串与+

连接起来
showUsage(std::wstring(L"Number format missing -") + oParam->mOption, true, 10);

我的系统operator<< stringstream的返回类型不兼容(它返回对ostream的引用,而不是对stringstream的引用),因此无法追加填充到stringstream并将其发送到单行代码中的函数(可能使用static_cast,但你当然不希望这个丑陋的黑客攻击)。因此,除非这是一个实现错误(不太可能!),否则您必须对代码进行大量更改,如上所述。

答案 1 :(得分:0)

我建议你使用stringstream的引用:

std::wstringstream& showUsage(std::wstringstream& oErrortext, bool bExit, int nExitCode)

(请注意&amp;

复制流似乎是一个问题。 (想想源和目的地会发生什么......)

如果您像往常一样传递它,则需要该字符串的副本。您可以通过引用来避免这种情况。