首页 > 解决方案 > 在可变参数宏中找出 __VA_ARGS__ 的类型

问题描述

假设,我有一个可变参数宏(例如,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)work 和 yield这样的东西,我会很感激std::pair<int, int> const&,所以在我的可变参数宏的主体decltype(__VA_ARGS__)中也会 yield std::pair<int, int> const&。不幸的是,这不起作用。

标签: c++macrosc-preprocessorvariadic-macros

解决方案


您可以将__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);

推荐阅读