【问题标题】:Find out the type of __VA_ARGS__ in a variadic macro在可变参数宏中找出 __VA_ARGS__ 的类型
【发布时间】:2019-03-09 05:50:34
【问题描述】:

假设我有一个可变参数宏(例如,MY_MACRO(...)),我将其称为以下方式:

MY_MACRO(std::pair<int, int> const &p)

现在,我的宏正文中的__VA_ARGS__ 将是std::pair&lt;int, int&gt; const &amp;p

有没有办法找出__VA_ARGS__ 的类型?

大概,如果decltype(std::pair&lt;int, int&gt; const &amp;p) 之类的东西可以工作并产生std::pair&lt;int, int&gt; const&amp;,我将不胜感激,所以在我的可变参数宏的主体中decltype(__VA_ARGS__) 也会产生std::pair&lt;int, int&gt; const&amp;。不幸的是,这不起作用。

【问题讨论】:

  • 预处理器宏是 C++ 的东西,就像从 C 继承和/或采用的所有其他东西一样。
  • @Deduplicator 埋头苦干。
  • 宏参数是任意字符串,不需要解析。所以说论据的类型是没有意义的。
  • @ShafikYaghmour:这是一个包含两个参数的列表,但可以使用 __VA_ARGS__

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


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2021-05-23
相关资源
最近更新 更多