使用即将推出的C++反射工具打印类型的全名
Using the upcoming C++ reflection facilities to print the full name of a type
目前,可以使用__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
分配的原因。
相关文章:
- 光线跟踪器灯光反射错误
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 在clang++预处理器中确定gcc工具链版本
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 参数化自定义CMake工具链
- 如何在QT中的自定义视频小工具t上绘制矩形
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 用于C++的静态二进制检测或二进制重写工具和框架
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- Q没有管理权限的 exe 无法启动维护工具
- C++合并排序可视化工具
- 为Bazel工具链指定sysroot
- 在自动工具中包含用于不同bin_Programs的不同库
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- Eclipse CDT clang 工具链 - 无法从链接器选项中删除 stdlibc++,但可以添加 libc++,E
- 使用不同的工具时,Eccodes 会产生不同的结果
- 使用即将推出的C++反射工具打印类型的全名