获取模板类所包含的类型

时间:2012-12-06 10:18:50

标签: c++ templates typeid

有 -

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)?

4 个答案:

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