在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)
这可能吗?
答案 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 )... );
}
免责声明:未经测试的代码。