我有一个断言宏,看起来像:
#define ASSERT(condition, ...) \
(condition) ? (void)0 : MyLogFunction(__LINE__, __VA_ARGS__)
MyLogFunction
也是一个可变参数模板:
template<typename... Args>
void MyLogFunction(int line, const Args&... args) {/*code*/}
除了我不想在断言调用中插入其他信息的情况外,一切正常。
所以这很好用:
ASSERT(false, "test: %s", "formatted");
但这不是:
ASSERT(false);
我相信有一种方法可以处理当没有变量args传递到宏调用时的情况,并且有一种方法可以插入类似简单字符串""
而不是__VA_ARGS__
答案 0 :(得分:0)
没有可移植的方法。 看看http://en.wikipedia.org/wiki/Variadic_macro
答案 1 :(得分:0)
不是宏的解决方案,但一个简单的解决方法是提供一个辅助变量函数模板,它可以获得0个参数并在那里进行条件检查:
#define ASSERT(...) \
MyLogHelper(__LINE__, __VA_ARGS__)
template<typename... Args>
void MyLogFunction(int line, const Args&... ) {/*code*/}
template<typename... Args>
void MyLogHelper(int line, bool condition, const Args&... args)
{
if (!condition) MyLogFunction(line,args...);
}