在可变参宏中找出__VA_ARGS__的类型

时间:2018-10-03 22:24:05

标签: c++ macros c-preprocessor variadic-macros

假设我有一个可变参数宏(例如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&。不幸的是,这行不通。

1 个答案:

答案 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);