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

Using the upcoming C++ reflection facilities to print the full name of a type

本文关键字:工具 反射 打印 类型 全名 C++      更新时间:2023-10-16

目前,可以使用__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&]

随着反射 TS 的到来和反射功能的出现C++,我想知道能够做类似事情的语法会是什么样子。

注意:由于反射 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 限定符,这就是我使用get_display_name_v的原因。


请注意,反射 TS 是基于类型的 - 每个reflexpr都为您提供了一个类型,您必须在其中进行基于类型的元编程。语言本身最终可能会采用的方法是基于的反射 - 也就是说reflexpr产生一小组预定义反射对象类型的值。这将使实际编码更容易,这就是为什么我们喜欢constexpr!和支持constexpr分配的原因。