返回别名标识符,而不是typeid(SOME_TYPE).name()中的类型
Return alias identificator instead of type in typeid(SOME_TYPE).name()
在下面的示例中
template <typename T>
void foo() {
const char* name = typeid(T).name();
std::cout << name;
}
变量"名称">将由类型"T"名称初始化。如果我们需要打印此模板类型名称,这将非常方便。但是,如果我们有别名:
using shortTypeName = std::smth::smth_else::smth_more;
在调用的结果中
foo<shortTypeName>();
将被打印为"std::smth::smth_else::smth_more"。我需要准确打印别名,但不是它定义的类型。有人可以给出建议,我该怎么做?
...别名标识器...
没有这样的事情,至少在编译之后没有。它只是语法糖,在最终可执行文件中不存在任何意义。
获取类型的本地名称(与实现定义和可能损坏的类型 id 名称相反)的唯一方法是使用 stringize/stringify 宏。
为了将来参考,当反射 TS 着陆时,这最终应该是可能的 - 但我还不知道是否期望它看起来像reflexpr(T).get_name()
,或者std::meta::name_of(^T)
,或者其他东西。
有人可以给出建议,我该怎么做?
该语言不支持执行此操作的机制。
您拥有的只是一个类型别名。
从 http://en.cppreference.com/w/cpp/language/type_alias:
类型别名声明引入了一个名称,该名称可用作由 type-id 表示的类型的同义词。它不会引入新类型,也不能更改现有类型名称的含义。
你不能。因为类型别名是透明的:它只是新类型的同义词,而不是新类型。作为实现细节,它甚至不会在类型系统中被破坏,因为它不是一个类型。
§7.1.3 类型定义说明符 [dcl.typedef]
[...]使用 typedef 说明符声明的名称将成为 typedef-name 。在其声明范围内,typedef-name 是 语法上等效于关键字并命名关联的类型 以第 8 条中所述的方式使用标识符。类型定义名称 因此是另一种类型的同义词。类型定义名称不 以类声明 (9.1) 或枚举的方式引入新类型 声明确实如此。
类型定义名称也可以通过别名声明引入。using 关键字后面的标识符成为 typedef-name,并且 标识符后面的可选属性说明符序列 到那个类型定义名称。它具有相同的语义,就好像它是 由 Typedef 说明符引入。特别是,它没有 定义一个新类型,它不应出现在类型 ID 中。
反正typeid(T).name();
几乎没用。在我们C++进行适当的反省之前,您必须求助于黑客来获得您想要的东西(宏、侵入性技术或外部代码生成器工具)。
- 部分定义/别名模板模板参数
- 如何在C++20中创建模板别名的推导指南
- 告诉c++编译器该参数没有别名
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 如何使用类型别名从模板化类中隐藏模板列表
- 将系数存储在头文件的数组中("does not name a type"错误)
- Clang 对使用的类型别名发出"unused type alias"警告
- 在基类子句中使用类中定义的typedefs/type别名