支持宏中的<<运算符

support << operator in a macro

本文关键字:lt 运算符 支持      更新时间:2023-10-16

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

#define report(s)   print(), throw std::runtime_error(s)

print()是一个函数,我总是调用它来打印一些预定义的内容。s需要支持:

report("abc"); // ok
report("abc"<<100); // == report("abc100")

除了任何 print(( 输出之外,不应打印任何其他内容。异常将被调用方捕获并打印在那里。

我发现很难在上述宏中支持<<。

附言report((是一个宏,在我的代码库中已经使用过,我只想改变它的行为。像报告("abc"<<100(这样的调用;必须得到支持。将其定义为函数并在末尾添加";"看起来不合适。

也许以下(未经测试的!(代码可能是鼓舞人心的

#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冲突的可能性,您甚至可以使用预处理器串联将其在大括号内出现的所有内容替换为_os##Lin(

#define report_at_bis(Log,Fil,Lin) report_at(Log,Fil,Lin)
#define report(Log) report_at_bis(Log,__FILE__,__LINE__)

这显示了宏真正有用的一种情况。