C++ 找出变量宏中的uu VA_ARGS_uuu的类型
据推测,我有一个可变宏(例如,C++ 找出变量宏中的uu VA_ARGS_uuu的类型,c++,macros,c-preprocessor,variadic-macros,C++,Macros,C Preprocessor,Variadic Macros,据推测,我有一个可变宏(例如,MY_macro(…)),我这样称呼它: MY_MACRO(std::pair<int, int> const &p) MY_宏(std::pair const&p) 现在,我的宏主体中的\uu VA\u ARGS\uu将是std::pair const&p 有没有办法找出\uu VA\u ARGS\uu的类型 大概,如果像decltype(std::pair const&p)这样的东西起作用并产生std::pair const&,我会很感激
MY_macro(…)
),我这样称呼它:
MY_MACRO(std::pair<int, int> const &p)
MY_宏(std::pair const&p)
现在,我的宏主体中的\uu VA\u ARGS\uu
将是std::pair const&p
有没有办法找出\uu VA\u ARGS\uu
的类型
大概,如果像
decltype(std::pair const&p)
这样的东西起作用并产生std::pair const&
,我会很感激,所以在我的变量宏体中decltype(
也会产生std::pair const&
)。不幸的是,这不起作用。您可以使用\uuu VA\u ARGS\uuu>作为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);
模板结构函数参数{};
模板结构func_param{using type=T;};
#定义FOO(…)\
做\
{ \
自动lambda=+[]([[可能未使用]]\uuuuuva\uuuargs{}\
使用type=func_param::type\
/*用“type”做些什么*/\
} \
而(0);
预处理器宏是C++的东西,就像继承和/或从C.@去复印机中使用的所有东西一样。宏参数是任意字符串,不必是可解析的。因此,谈论参数的类型没有什么意义。@ShafikYaghmour:这是一个包含两个参数的列表,但可以使用\uu VA_ARGS\uuuu
注意使用Yes,还有一个技巧,即对这样的lambda应用一元+
强制转换,因为没有重载的运算符+
匹配lambda类型,但是指向函数的指针是一元+
内置含义的有效操作数。