我想要一个函数/定义采用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);
这可以实现吗?如果是这样,怎么样?
答案 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__)))
没有太多要解释的。 PREFIX_TUPLE
使用BOOST_PP_ENUM
生成逗号分隔列表。辅助宏只需要数据来完成工作;为此,我们只给它一个前缀的两个tuple和要粘贴的元素元组。