2

我有一个断言宏,它看起来像:

#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);

我相信有一种方法可以处理没有可变参数参数已传递给宏调用的情况,并且有一种方法可以插入简单字符串之类的东西""而不是__VA_ARGS__

4

2 回答 2

0

没有便携的方法可以做到这一点。看看http://en.wikipedia.org/wiki/Variadic_macro

于 2013-08-11T05:50:11.230 回答
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...);
}
于 2013-08-11T08:50:54.183 回答