预处理器函数宏中的参数转发
Parameter forwarding in preprocessor function macro
是否可以转发参数列表来创建函数声明?
给出了以下伪宏:
#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)); \
}
使用如下:
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)
);
}
仅供参考,看起来很奇怪的参数列表是为了处理包含逗号的类型(例如 std::array<int, 4>
)。双括号是因为 BOOST_PP_SEQ_SIZE
也被逗号绊倒,更深一层...
是否可以转发参数列表来创建函数声明? 给出了以下伪宏:
#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)); \
}
使用如下:
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)
);
}
仅供参考,看起来很奇怪的参数列表是为了处理包含逗号的类型(例如 std::array<int, 4>
)。双括号是因为 BOOST_PP_SEQ_SIZE
也被逗号绊倒,更深一层...