有 -
C_Type.h
#ifndef C_TYPE_H
#define C_TYPE_H
template <class T>
class C_Type {
public:
T m_val;
// implementation ...
};
#endif
一个程序 -
#include <iostream>
#include <typeinfo>
#include "C_Type.h"
using namespace std ;
int main () {
C_Type<int> a ;
cout <<typeid(a.m_val).name()<<endl;
}
我尝试提取由int
组成的C_Type<int>
,上述程序只提供了输出 - i
。
修改:
是否可以获得类型(即int或i)而不考虑类成员(即m_val
)?
答案 0 :(得分:5)
typeid::name返回的名称是特定于编译器的,对于某些编译器来说,它是可怕的(如i
int
)。大多数编译器都支持对名称进行解码,从而导致更好的表示,但仍然无法用于程序化。
以下是常见编译器的demangling API列表:
答案 1 :(得分:3)
回答你的上一个问题(关于获取类型
没有提到会员):没有。在标准库中,
有一个约定为typedef
提供
实例化类型和从中派生的类型;通常的名字
是value_type
,但也有例外(例如std::map
)。如果
你想坚持这个约定(这不是一个坏主意),
你应该添加:
typedef T value_type;
到你的班级(作为公共成员),并在你的时候引用它 想要类型,而不是一些任意成员(可能或 可能不存在)。
答案 2 :(得分:1)
“i”是正确的名称可能是“int”类型? 这只是一个名字!你想用这个名字做什么?
int main () {
C_Type<int> a ;
int test=0;
if(typeid(a.m_val) == typeid(test))
cout <<"Int"<<endl;
}
答案 3 :(得分:0)
如果您需要从模板规范中检索模板参数(并且您有C ++ 11),则可以执行以下操作:
template <template <typename> class Templ, typename T>
T typeGetter(Templ<T>);
然后,在你的主要:
int main () {
C_Type<int> a;
decltype(typeGetter(a)) i = 7; //declares i to be int
}