返回别名标识符,而不是typeid(SOME_TYPE).name()中的类型

Return alias identificator instead of type in typeid(SOME_TYPE).name()

本文关键字:别名 TYPE name 类型 SOME 返回 typeid 标识符      更新时间:2023-10-16

在下面的示例中

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]

  1. [...]使用 typedef 说明符声明的名称将成为 typedef-name 。在其声明范围内,typedef-name 是 语法上等效于关键字并命名关联的类型 以第 8 条中所述的方式使用标识符。类型定义名称 因此是另一种类型的同义词。类型定义名称不 以类声明 (9.1) 或枚举的方式引入新类型 声明确实如此。

  2. 类型定义名称也可以通过别名声明引入。using 关键字后面的标识符成为 typedef-name,并且 标识符后面的可选属性说明符序列 到那个类型定义名称。它具有相同的语义,就好像它是 由 Typedef 说明符引入。特别是,它没有 定义一个新类型,它不应出现在类型 ID 中。

反正typeid(T).name();几乎没用。在我们C++进行适当的反省之前,您必须求助于黑客来获得您想要的东西(宏、侵入性技术或外部代码生成器工具)。