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.类型定义]
typeid(T.name()不管怎么说,code>几乎是无用的。除非我们在C++中有适当的内省,否则你必须求助于黑客来获得你想要的(宏、入侵技术或外部代码生成器工具)。因为类型别名是透明的:它只是新类型的同义词,而不是新类型。作为一个实现细节,它甚至不会在类型系统中被破坏,因为它不是一个类型
§7.1.3类型定义说明符[dcl.类型定义]
[…]使用typedef说明符声明的名称将成为typedef名称。在其声明的范围内,typedef名称是
语法上等同于关键字并命名关联的类型
按照第8条所述的方式使用标识符。typedef名称
因此是另一种类型的同义词typedef名称不存在
以类声明(9.1)或枚举的方式引入新类型
声明确实如此
typedef名称也可以通过别名声明引入。using关键字后面的标识符将成为typedef名称和
标识符后的可选属性说明符seq
到那个名字。它的语义与
由typedef说明符引入。尤其是,它没有
定义一个新类型,它不会出现在类型id中
typeid(T.name()不管怎么说,code>几乎是无用的。除非我们在C++中有适当的内省,否则你必须求助于黑客来获得你想要的(宏,入侵技术或外部代码生成器工具)。你不能,<代码>名称()>代码>是实现的。你应该只使用Type ID来调试目的:我认为你不能用当前的C++标准版本来避免RTTI。也就是说,在C++中没有编译时的反映。而且,AAIK只是一个新的类型名称,所以它将共享同一个Type ID,我不认为有什么方法可以让Type知道它应该给你什么,唯一能帮助你的是一个严格化的宏。是定义的实现。您应该只使用Type ID进行调试:我认为您不能用当前的C++标准版本避免RTTI。也就是说,在C++中没有编译时的反映。而且,AAIK只是一个新的名称,所以它将共享相同的Type ID,我认为Type不能用任何方式知道它应该给你什么,唯一能帮助你的是一个严格化的宏。
foo<shortTypeName>();