我想编写一个宏,它将 std::ostream& operator<< 连接对象的列表作为其唯一参数,并将合并的字符串作为单个 std::string 对象传递给函数。将合并后的字符串传递给函数的能力是关键;在下面的示例中,我知道示例本身可以通过定义宏来重写以工作ERR_MSG(inputs) std::cout << "ERROR: " << inputs
,但是将输出发送到 std::cout 不是目标,它只是我为示例选择的测试目标。
我正在使用 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 传递给函数,而不管“输入”是什么。很抱歉没有在前面提到。