我想实现一个执行以下操作的宏:
#define report(s) print(), throw std::runtime_error(s)
print()
是一个我总是打电话来打印一些预定义内容的函数。 s
需要支持:
report("abc"); // ok
report("abc"<<100); // == report("abc100")
除了print()输出外,还不应打印任何其他内容。调用者将捕获该异常并在那里打印。
我发现很难支持&lt;&lt;在上面的宏。
P.S。 report()是一个已经在我的代码库中的每个位置使用过的宏,我只是想改变它的行为。像报告一样的呼叫(&#34; abc&#34;&lt;&lt; 100);必须得到支持。将其定义为一项功能并添加&#39;;&#39;最后看起来不合适。
答案 0 :(得分:2)
也许以下(未经测试的!)代码可能是鼓舞人心的
#define report(Log) do { std::ostringstream _os; \
_os << Log << std::flush; print(_os.str()); \
throw std::runtime(_os.str()); } while(0)
您可以将其用作report("x=" << x)
;
顺便说一下,您甚至可以使用
传递源位置#define report_at(Log,Fil,Lin) do { std::ostringstream _os; \
_os << Fil << ":" << Lin << ": " << Log << std::flush; \
print(_os.str()); \
throw std::runtime(_os.str()); } while(0)
(为了降低与_os
发生冲突的可能性,您甚至可以使用预处理器concatenation将_os##Lin
替换为括号内的所有匹配项
#define report_at_bis(Log,Fil,Lin) report_at(Log,Fil,Lin)
#define report(Log) report_at_bis(Log,__FILE__,__LINE__)
这显示了宏非常有用的一种情况。