我想寫一個宏,它只需要一個std :: ostream列表& operator < < <級聯對象並將統一字符串作爲單個std :: string對象傳遞給函數。將合併字符串傳遞給函數的能力是關鍵;在下面的示例中,我知道示例本身可以被重寫爲簡單地通過將宏定義爲ERR_MSG(inputs) std::cout << "ERROR: " << inputs
來工作,但將輸出發送到std :: cout不是目標,它只是我爲示例選擇的測試目標。需要一個宏來創建一個std :: ostringstream std :: string和一個<< arg list
我正在使用GCC 4.1.2(Red Hat 4.1.2-52)並且升級它不是一個選項。這裏是什麼,我已經嘗試了很熬下來的版本:
#include <sstream>
#include <iostream>
#define ERR_MSG(inputs) errMsg(std::ostringstream().str()) // 1
#define ERR_MSG(inputs) errMsg((std::ostringstream()<<inputs).str()) // 2
<aReturnType> errMsg(const std::string& msg) // use with 1 & 2
{
std::cout << "\nERROR: " << msg << "\n\n";
return <someObjectCreatedBasedOnTheInput>;
}
#define ERR_MSG(inputs) errMsg(std::ostringstream()<<inputs) // 3
<aReturnType> errMsg(const std::ostringstream& msg) // use with 3
{
std::cout << "\nERROR: " << msg.str() << "\n\n";
return <someObjectCreatedBasedOnTheInput>;
}
int main()
{
ERR_MSG("A number: " << 24 << ", a char: " << 'c' << ", that's all!");
}
宏#1編譯,但當然版畫不過是「」的消息。無論是宏2 & 3編譯,併產生以下錯誤:
#define ERR_MSG(inputs) errMsg((std::ostringstream()<<inputs).str()) // 2
error: ‘struct std::basic_ostream<char, std::char_traits<char> >’ has no member named ‘str’
#define ERR_MSG(inputs) errMsg(std::ostringstream()<<inputs) // 3
no matching function for call to ‘errMsg(std::basic_ostream<char, std::char_traits<char> >&)’
note: candidates are: char* errMsg(const std::string&)
note: char* errMsg(const std::ostringstream&)
我不興趣我怎麼能改寫這個沒有宏;我可以很輕鬆地做到這一點。
===更新:=== 我忘了提及,在它的真實使用情況下,宏調用的函數返回一個可能被宏的調用者使用的對象。這使無法在單個表達式中實現的宏實現失效,其結果是宏調用的函數的返回類型。不管「輸入」是什麼,宏的「什麼都不做」實現(對於發佈版本)只會將一個空的std :: string傳遞給該函數。對不起,先不提。
'std :: ostringstream :: operator <<'返回一個'std :: ostream&'。 – chris
嗯。好。關於這個目標如何實現的任何想法? (使用宏和<<創建一個傳遞給函數的std :: string)? – phonetagger
我相信'std :: ostream'中有一個很好的函數,你可以使用const std :: ostream&'overload來打印它。它可能是'rdbuf',但我忘記了。 – chris