代码之家  ›  专栏  ›  技术社区  ›  Vincent

使用即将到来的C++反射工具打印类型的全名

  •  1
  • Vincent  · 技术社区  · 7 年前

    目前,可以使用 __PRETTY_FUNCTION__ gcc ,和 clang :

    #include <iostream>
    
    template <class T>
    void print_type() {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    
    int main(int argc, char* argv[]) {
      print_type<const volatile int&>();
      return 0;
    }
    

    将输出:

    void print_type() [with T = const volatile int&]
    

    reflection TS C++中的“反射”和“反射”设施,我想知道什么样的语法看起来能够做类似的事情。

    注意:由于反射TS还没有被投票通过,我只是在寻找一个“可能的”语法。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Barry    7 年前

    我猜是这样的:

    template <class T>
    void print_type() {
        using F = reflexpr(print_type<T>);
        std::cout << get_display_name_v<F> << std::endl;
    }
    

    你必须这样 reflexpr 一件特别的事情,没有办法得到“这个函数我发现我自己在”-所以这就是 print_type<T> . 文档只是说这是实现定义的。

    如果你想把这些都写出来,你可以:

    template <class T>
    void print_type() {
        std::cout << "void "
                  << get_name_v<reflexpr(print_type<T>)> // guaranteed "print_type"
                  << "() [with T = "
                  << get_display_name_v<reflexpr(T)> 
                  << "]" << std::endl;
    }
    

    我不清楚是什么 get_name_v<reflexpr(const volatile int&)> 实际上是的。好像是空的- T 简单类型说明符 get_display_name_v .


    反身 提供一个类型,您必须在其中执行基于类型的元编程。语言本身最终可能采用的方法是 -基于反射-即 反身 constexpr! 支持 constexpr