支持<<宏的运算符

时间:2017-08-24 16:11:24

标签: c++ c++11

我想实现一个执行以下操作的宏:

#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;最后看起来不合适。

1 个答案:

答案 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__)

这显示了宏非常有用的一种情况。