C++11 预处理器函数宏中的参数转发

C++11 预处理器函数宏中的参数转发,c++11,macros,c-preprocessor,C++11,Macros,C Preprocessor,是否可以转发参数列表以创建函数声明? 给出了以下伪宏: #define FUNCTION_DECLARATION(function_name, ...) \ void function_name(__VA_ARGS__) \ { \ other_function_but_gets_the_same_params(__VA_ARGS__); \ } 我想使用类似于以下语法的内容创建函数声明: FUNCTION_DECLARATION(MyFunction, char, char, int

是否可以转发参数列表以创建函数声明? 给出了以下伪宏:

#define FUNCTION_DECLARATION(function_name, ...) \
void function_name(__VA_ARGS__) \
{ \
    other_function_but_gets_the_same_params(__VA_ARGS__); \
}
我想使用类似于以下语法的内容创建函数声明:

FUNCTION_DECLARATION(MyFunction, char, char, int)

好吧,你问这个很有趣,因为我上周就做了这个

这是你感兴趣的一点。使用Boost.Preprocessor

#define STRIP_PARENS(...)   __VA_ARGS__

#define PARAM_PROTO(i, elem)                                            \
    STRIP_PARENS elem _ ## i

#define PARAM_FWD(i, elem)                                              \
    std::forward<STRIP_PARENS elem>(_ ## i)

#define MAKE_PARAM(r, macro, i, elem)                                   \
    STRIP_PARENS BOOST_PP_IF(                                           \
        BOOST_PP_IS_EMPTY(STRIP_PARENS elem),                           \
        (),                                                             \
        (BOOST_PP_COMMA_IF(i) macro(i, elem))                           \
    )

#define MAKE_PARAM_LIST(params, macro)                                  \
    BOOST_PP_SEQ_FOR_EACH_I(MAKE_PARAM, macro, params)

#define FUNCTION_DECLARATION(function_name, params)                     \
    void function_name(MAKE_PARAM_LIST(params, PARAM_PROTO)) {          \
        other_function(MAKE_PARAM_LIST(params, PARAM_FWD));             \
    }
#定义带参数(…)(变量)__
#定义参数PROTO(i,elem)\
脱衣舞
#定义参数FWD(i,元素)\
标准:正向(i)
#定义MAKE_参数(r、宏、i、元素)\
如果(\
增压泵是空的(条形元件)\
(),                                                             \
(BOOST_PP_逗号_IF(i)宏(i,elem))\
)
#定义生成参数列表(参数、宏)\
每个参数的BOOST_PP_SEQ_(生成参数、宏、参数)
#定义函数\声明(函数\名称、参数)\
void函数名(MAKE_PARAM_LIST(params,PARAM_PROTO)){\
其他函数(生成参数列表(参数,参数FWD))\
}
使用方法如下:

FUNCTION_DECLARATION(myFunction, ((int))((float))((std::string&)))

// Expands to :
void myFunction(int _0, float _1, std::string& _2) {
    other_function(
        std::forward<int>(_0),
        std::forward<float>(_1),
        std::forward<std::string&>(_2)
    );
}
函数声明(myFunction,((int))((float))((std::string&)) //扩展到: void myFunction(int 0,float 1,std::string&2){ 其他功能( 标准::正向(_0), 标准::正向(_1), 标准::正向(_2) ); } 仅供参考,外观怪异的参数列表用于处理包含逗号的类型(例如
std::array
)。双圆括号是因为
BOOST\u PP\u SEQ\u SIZE
也会在逗号上跳闸,更深一层