使用C ++宏从嵌套括号中提取项目

时间:2015-08-18 19:23:23

标签: c++ macros c-preprocessor

在C ++中,使用宏很容易拉开参数,执行以下操作:

#define printThings(stringPrinting, param1, param2) printf(stringPrinting, param1, param2)

printThings(stringPrinting, param1, param2)

// Goes to

printf(stringPrinting, param1, param2)

但是我无法找到办法:

#define printThings(a, b) printf(?)

printThings(stringPrinting, Blarg(param1, param2))

// Goes to

printf(stringPrinting, param1, param2)

这可能吗?

1 个答案:

答案 0 :(得分:1)

你可以

#define UNPACK( a, b ) a, b
#define printThings( s, args ) printf( s, UNPACK args )

这是高级预处理器内容的主要宏习语之一。处理可变参数的规范技术,例如:在参数上分发一些宏调用,是由一些我不记得的人(法语?)在comp.lang.c或comp.std.c newsgroup ca 1999中发布的,我认为它可能是后来的。 Boost预处理器库以及Boost参数库有很多非常高级的东西。如果你想学习。 :)

注1:看起来你真的想要一个用...(三个点)定义的可变参数宏而不是命名参数。我相信你可以谷歌那个。

注2:由于宏是Evil™,你可能真的想要一些

的变体
template< class... Args >
void printThings( char const* s, Args&&... args )
{
    printf( s, std::forward<Args>( args )... );
}

免责声明:未经测试的代码。