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

2024-05-19

目前,可以使用__PRETTY_FUNCTION__在下面显示模板类型gcc, and 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&]

随着反射TS https://cplusplus.github.io/reflection-ts/draft.pdfC++ 中的到来和反射设施,我想知道能够执行类似操作的语法是什么样的。

注意:由于反射 TS 尚未投票,我只是在寻找“可能的”语法。


猜测是这样的:

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不是一个简单类型说明符在这种情况下)并且没有提到 cv- 或 ref-qualifiers,这就是我使用的原因get_display_name_v.


请注意,反射 TS 是基于类型的 - 每个reflexpr给你一个类型,你必须在其中进行基于类型的元编程。语言本身最终可能采用的方法是value基于反射 - 即reflexpr产生一小组预定义反射对象类型的值。这将使实际编码变得更容易,这就是为什么我们的论文喜欢constexpr!和支持constexpr作品中的分配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用即将推出的 C++ 反射工具来打印类型的全名 的相关文章

随机推荐