假设我有一个可变参数宏(例如MY_MACRO(...)
),我用以下方式称呼它:
MY_MACRO(std::pair<int, int> const &p)
现在,我宏的正文中的__VA_ARGS__
将是std::pair<int, int> const &p
。
是否可以找出__VA_ARGS__
的类型?
大概,如果decltype(std::pair<int, int> const &p)
之类的东西能够工作并产生std::pair<int, int> const&
,我将不胜感激,因此在可变参宏的正文中decltype(__VA_ARGS__)
也将产生std::pair<int, int> const&
。不幸的是,这行不通。
答案 0 :(得分:4)
您可以将__VA_ARGS__
用作lambda参数,然后将该lambda转换为函数指针并提取参数类型:
template <typename T> struct func_param {};
template <typename T> struct func_param<void(*)(T)> {using type = T;};
#define FOO(...) \
do \
{ \
auto lambda = +[]([[maybe_unused]] __VA_ARGS__) {}; \
using type = func_param<decltype(lambda)>::type; \
/* Do something with `type`. */\
} \
while (0);