2013-11-15 32 views
0

我有這個函數應該把一個可選的流參數打印成errortext。可能創建臨時streamobject作爲函數的參數?

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); 

可是爲什麼我想用字符串流的理由是,爲了能夠建立一個generaetd串,不只是靜態字符串。

例子:

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

但我得到一個編譯錯誤與此有關。

  1. 如何創建這個臨時對象並用一行代碼流傳輸參數(或者我必須首先創建它,因此無法用一行代碼)?
  2. 有沒有更好的解決方案,我想在這裏做什麼(而不是可變varargs)?

回答

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); 

我的系統具有的stringstreamoperator<<不兼容的返回類型(其返回ostream的引用,而不是對stringstream的引用),因此不可能將內容追加到stringstream並將其發送到一行中的函數的代碼(可能使用static_cast,但你肯定不希望這個醜陋的黑客)。因此,除非這是一個實現錯誤(不太可能!),否則您必須對代碼進行大的修改,就像上面提到的那樣。

0

我建議你使用的stringstream的一個參考:

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

(注意&

複製流似乎是一個問題。 (思考源和目的地會發生什麼......)

如果你像傳遞它一樣,需要一個字符串的副本。你可以通過引用來避免這種情況。