0

我有这个函数,它应该将一个可选的流参数打印为错误文本。

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. 有没有更好的解决方案来解决我在这里尝试做的事情(不搞乱可变参数)?
4

2 回答 2

2

您可以使用 astring而不是流:

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<<of的返回类型不兼容stringstream(它返回对 的引用ostream,而不是对 的引用stringstream),因此不可能将内容附加到 astringstream并将其发送到单行代码中的函数(可能可以使用 a static_cast,但你当然不想要这个丑陋的黑客)。因此,除非这是一个实现错误(不太可能!),否则您必须像上面建议的那样对代码进行大的更改。

于 2014-01-14T13:31:21.163 回答
0

我建议您使用 stringstream 的参考:

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

(注意&

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

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

于 2014-01-14T12:17:29.993 回答