返回alias标识符而不是typeid in type(SOME_TYPE).name()

时间:2018-03-21 16:13:32

标签: c++ c++11

在以下示例中

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'。我需要准确打印别名,但不是它定义的类型。有人可以提出建议,我该怎么做?

3 个答案:

答案 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]

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

  2.   
  3. 也可以通过别名声明引入typedef-name。 using关键字后面的标识符变为typedef-name和   标识符appertains后面的可选attribute-specifier-seq   到那个typedef-name。它具有与它相同的语义   由typedef说明符引入。特别是,它没有   定义新类型,它不应出现在type-id。

  4. 中   
无论如何,

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