【发布时间】:2012-09-28 21:26:48
【问题描述】:
我想编写一个宏,它将 std::ostream& operatorERR_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 传递给函数,而不管“输入”是什么。很抱歉之前没有提及。
【问题讨论】:
-
std::ostringstream::operator<<返回一个std::ostream &。 -
嗯。好的。关于如何实现这一目标的任何想法? (使用宏和
-
我相信在
std::ostream的某个地方有一个不错的函数,您可以使用const std::ostream &重载来打印它。可能是rdbuf,但我忘记了。
标签: c++ ostringstream