在以下示例中
template <typename T>
void foo() {
const char* name = typeid(T).name();
std::cout << name;
}
变量'name'将按类型'T'名称初始化。如果我们需要打印此模板类型名称,则非常方便。但是,如果我们有别名:
using shortTypeName = std::smth::smth_else::smth_more;
在通话结果中
foo<shortTypeName>();
将打印'std :: smth :: smth_else :: smth_more'。我需要准确打印别名,但不是它定义的类型。有人可以提出建议,我该怎么做?
答案 0 :(得分:1)
...别名识别器......
没有这样的东西,至少在编译之后没有。它只是语法糖,并且在最终的可执行文件中不存在任何意义。
仅方式来获取类型的本地名称(与实现定义且可能已损坏的typeid名称相对)是使用stringize / stringify宏。
答案 1 :(得分:1)
有人可以提出建议,我该怎么做?
该语言不支持执行此操作的机制。
你拥有的只是一个类型别名。
来自http://en.cppreference.com/w/cpp/language/type_alias:
类型别名声明引入了一个名称,该名称可以用作type-id表示的类型的同义词。它不会引入新类型,也不能更改现有类型名称的含义。
答案 2 :(得分:1)
你做不到。因为类型别名是透明的:它只是新类型的同义词,而不是新类型。作为一个实现细节,它甚至不会在类型系统中被破坏,因为它不是一个类型。
无论如何,§7.1.3typedef说明符[dcl.typedef]
[...]使用typedef说明符声明的名称将成为typedef-name。在其声明的范围内,typedef-name是 在语法上等同于关键字并命名关联的类型 使用第8章中描述的方式使用标识符.typedef-name 因此是另一种类型的同义词。 typedef-name没有 引入新类型类声明(9.1)或枚举的方式 声明确实。
- 中 醇>
也可以通过别名声明引入typedef-name。 using关键字后面的标识符变为typedef-name和 标识符appertains后面的可选attribute-specifier-seq 到那个typedef-name。它具有与它相同的语义 由typedef说明符引入。特别是,它没有 定义新类型,它不应出现在type-id。
typeid(T).name();
几乎没用。在我们对C ++进行适当的内省之前,你必须求助于黑客来获得你想要的东西(宏,侵入式技术或外部代码生成器工具)。