Узнайте тип __VA_ARGS__ в макрокоманде - PullRequest
0 голосов
/ 04 октября 2018

Предположительно, у меня есть макрос с переменным значением (например, 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 голосов
/ 04 октября 2018

Вы можете использовать __VA_ARGS__ в качестве параметра лямбды, затем преобразовать эту лямбду в указатель функции и извлечь тип параметра:

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);
...