Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回别名标识符,而不是typeid(SOME_type).name()中的类型_C++_C++11 - Fatal编程技术网

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

C++ 返回别名标识符,而不是typeid(SOME_type).name()中的类型,c++,c++11,C++,C++11,在下面的示例中 template <typename T> void foo() { const char* name = typeid(T).name(); std::cout << name; } 在通话结果中 foo<shortTypeName>(); foo(); 将打印“std::smth::smth_else::smth_more”。我需要准确地打印别名,而不是它定义的类型。谁能给我一个建议,我怎么能做到 。。。别名识别器 没

在下面的示例中

template <typename T>
void foo() {
    const char* name = typeid(T).name();
    std::cout << name;
}
在通话结果中

foo<shortTypeName>();
foo();
将打印“std::smth::smth_else::smth_more”。我需要准确地打印别名,而不是它定义的类型。谁能给我一个建议,我怎么能做到

。。。别名识别器

没有这样的事情,至少在编译之后没有。它只是语法上的糖分,在最终的可执行文件中根本不存在

获取类型的本地名称的唯一方法(与实现定义的、可能已损坏的typeid名称相反)是使用stringize/stringify宏

。。。别名识别器

没有这样的事情,至少在编译之后没有。它只是语法上的糖分,在最终的可执行文件中根本不存在

获取类型的本地名称的唯一方法(与实现定义的、可能已损坏的typeid名称相反)是使用stringize/stringify宏

谁能给我一个建议,我怎么能做到

该语言不支持执行此操作的机制

您所拥有的只是一个类型别名

发件人:

类型别名声明引入的名称可用作type-id表示的类型的同义词。它不引入新类型,也不能更改现有类型名称的含义

谁能给我一个建议,我怎么能做到

该语言不支持执行此操作的机制

您所拥有的只是一个类型别名

发件人:

类型别名声明引入的名称可用作type-id表示的类型的同义词。它不引入新类型,也不能更改现有类型名称的含义


你不能。因为类型别名是透明的:它只是新类型的同义词,而不是新类型。作为一个实现细节,它甚至不会在类型系统中被破坏,因为它不是一个类型

§7.1.3类型定义说明符[dcl.类型定义]

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

  • typedef名称也可以通过别名声明引入。using关键字后面的标识符将成为typedef名称和 标识符后的可选属性说明符seq 到那个名字。它的语义与 由typedef说明符引入。尤其是,它没有 定义一个新类型,它不会出现在类型id中


  • typeid(T.name()几乎是无用的。除非我们在C++中有适当的内省,否则你必须求助于黑客来获得你想要的(宏、入侵技术或外部代码生成器工具)。因为类型别名是透明的:它只是新类型的同义词,而不是新类型。作为一个实现细节,它甚至不会在类型系统中被破坏,因为它不是一个类型

    §7.1.3类型定义说明符[dcl.类型定义]

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

  • typedef名称也可以通过别名声明引入。using关键字后面的标识符将成为typedef名称和 标识符后的可选属性说明符seq 到那个名字。它的语义与 由typedef说明符引入。尤其是,它没有 定义一个新类型,它不会出现在类型id中


  • typeid(T.name()几乎是无用的。除非我们在C++中有适当的内省,否则你必须求助于黑客来获得你想要的(宏,入侵技术或外部代码生成器工具)。

    你不能,<代码>名称()>代码>是实现的。你应该只使用Type ID来调试目的:我认为你不能用当前的C++标准版本来避免RTTI。也就是说,在C++中没有编译时的反映。而且,AAIK只是一个新的类型名称,所以它将共享同一个Type ID,我不认为有什么方法可以让Type知道它应该给你什么,唯一能帮助你的是一个严格化的宏。是定义的实现。您应该只使用Type ID进行调试:我认为您不能用当前的C++标准版本避免RTTI。也就是说,在C++中没有编译时的反映。而且,AAIK只是一个新的名称,所以它将共享相同的Type ID,我认为Type不能用任何方式知道它应该给你什么,唯一能帮助你的是一个严格化的宏。
    foo<shortTypeName>();