改变可变参数

时间:2017-11-16 04:47:49

标签: c c-preprocessor

我想要一个函数/定义采用variadic参数包,它扩展了在某些模式中改变每个参数,如:

foo(1,2,3);
foo(1,2,3,4,5);

应扩展为

bar(modifier_1,modifier_2,modifier_3);
bar(modifier_1,modifier_2,modifier_3,modifier_4,modifier_5);
这可以实现吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

使用boost预处理器你可以这样做:

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/preprocessor/repetition/enum.hpp>

#define PREFIX_TUPLE_HELPER(z,n,data) \
   BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(0,data),\
                BOOST_PP_TUPLE_ELEM(n,BOOST_PP_TUPLE_ELEM(1,data)))

#define PREFIX_TUPLE(PREFIX_,TUPLE_) BOOST_PP_ENUM \
   ( BOOST_PP_TUPLE_SIZE(TUPLE_), \
     PREFIX_TUPLE_HELPER, \
     (PREFIX_,TUPLE_))

#define foo(...) bar(PREFIX_TUPLE(modifier_,(__VA_ARGS__)))

Online demo here.

没有太多要解释的。 PREFIX_TUPLE使用BOOST_PP_ENUM生成逗号分隔列表。辅助宏只需要数据来完成工作;为此,我们只给它一个前缀的两个tuple和要粘贴的元素元组。