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类型,但是指向函数的指针是一元
+
内置含义的有效操作数。