我在理解typeid
和实际type_info
对象的返回类型之间的对应方面遇到了一些麻烦,这些对象似乎与通常的对象不同。例如,我可以......
std::cout << typeid(int).name() << std::endl;
......并从程序中获得一个体面的行为......但这不会编译......
std::type_info a(int);
std::cout << a.name() << std::endl;
编译器输出:
type_info.cpp: In function 'int main()':
type_info.cpp:6:17: error: request for member 'name' in 'a', which is of non-class type 'std::type_info(int)'
......我也不能......
if(a == typeid(int)) {/*Do something*/ } //Looong error message
我错过了什么?
答案 0 :(得分:4)
首先,烦恼的解析:
std::type_info a(int);
a
是一个功能(转int
并返回std::type_info
)。
其次,std::type_info
不可复制,因此您无法按值存储它。如果符合您的需要,您可以使用参考:
const std::type_info &a(typeid(int));
如果您需要实际存储std::type_info
个对象(如同)&#34;按值,&#34;请改用std::type_index
;它是为此而设计的:
std::type_index a(typeid(int));
std::cout << a.name() << std::endl;
答案 1 :(得分:1)
std::type_info
既不是可复制的,也不是可复制的。因此,您无法执行std::type_info a = typeid(...)
之类的内容。
const std::type_info &someTypeId(typeid(someType));
您还可以存储指向std::type_info
对象的指针,因为typeid会返回左值。
如果您想将std::type_info
个对象用作容器中的键,还有std::type_index
。它本质上是指向std::type_info
指针的薄包装器。 std::type_index
是C ++ 11的一项功能。