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

ryevplcw  于 2023-01-22  发布在  其他
关注(0)|答案(3)|浏览(135)

在以下示例中

template <typename T>
void foo() {
    const char* name = typeid(T).name();
    std::cout << name;
}

变量'name'将由类型'T' name初始化。如果我们需要打印此模板类型名称,这非常方便。但是,如果我们有别名:

using shortTypeName = std::smth::smth_else::smth_more;

在呼叫的结果中

foo<shortTypeName>();

将打印'std::smth::smth_else::smth_more'。我需要打印准确的别名,但不是它定义的类型。有人能给我一个建议吗,我该怎么做?

vi4fp9gy

vi4fp9gy1#

...别名标识符...
没有这样的东西,至少在编译之后没有。它只是语法上的糖衣,在最终的可执行文件中根本不存在。
获取类型的本地名称(与实现定义的和可能损坏的typeid名称相反)的 * 唯一 * 方法是使用stringize/stringify宏。
作为将来的参考,这最终应该是可能的,当Reflection TS的土地-但我还不知道是否期望它看起来像reflexpr(T).get_name(),或std::meta::name_of(^T),或其他东西了。

btqmn9zl

btqmn9zl2#

有人能给予个建议吗,我该怎么做?
该语言不支持执行此操作的机制。
您所拥有的只是一个类型别名。
http://en.cppreference.com/w/cpp/language/type_alias开始:
类型别名声明引入一个名称,该名称可用作由type-id表示的类型的同义词。它不引入新类型,也不能更改现有类型名称的含义。

agyaoht7

agyaoht73#

不能。因为类型别名是透明的:它只是一个新类型的同义词,而不是一个新类型。作为一个实现细节,它甚至不会在类型系统中被损坏,因为它不是一个类型。
§7.1.3类型定义说明符[dcl.typedef]
1.[......]用typedef说明符声明的名称变成了typedef-name。typedef-name在语法上等同于关键字,并以第8条中描述的方式命名与标识符关联的类型。因此,typedef-name是另一个类型的同义词。typedef-name不像类声明那样引入新类型(9.1)或枚举声明执行。

  1. typedef-name也可以通过别名声明引入。using关键字后面的标识符成为typedef-name,标识符后面的可选属性说明符-seq属于该typedef-name。它的语义与通过typedef说明符引入时的语义相同。特别是,它没有定义新类型并且不应出现在typedid中。
    无论如何,typeid(T).name();几乎是无用的。直到我们在C++中有了适当的自省,你才能求助于黑客来获得你想要的(宏,侵入式技术或外部代码生成器工具)。

相关问题