变分宏参数

Variadic macros arguments

本文关键字:参数      更新时间:2023-10-16

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

#define ASSERT(condition, ...) 
  (condition) ? (void)0 : MyLogFunction(__LINE__, __VA_ARGS__)

MyLogFunction也是一个可变模板:

template<typename... Args>
void MyLogFunction(int line, const Args&... args) {/*code*/}

除了我不想在assert调用中插入额外信息的情况外,一切都很好。

所以这很好:

ASSERT(false, "test: %s", "formatted");

但这不是:

ASSERT(false);

我相信有一种方法可以处理没有变量参数被传递到宏调用中的情况,并且有一种方式可以插入类似于简单字符串""而不是__VA_ARGS__

这并不是一个真正的宏解决方案,但一个简单的解决方案是提供一个辅助变量函数模板,它可以获得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...);
}

没有可移植的方法。看看http://en.wikipedia.org/wiki/Variadic_macro