3

有——

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

4 回答 4

5

typeid:: name 返回的名称是特定于编译器的,对于某些编译器来说它是可怕的(比如ifor int)。大多数编译器都支持名称的去修饰,这会带来更好的表示,但对于编程使用仍然无用。

以下是常用编译器的解组 API 列表:

于 2012-12-06T10:21:36.817 回答
3

回答您的最后一个问题(关于在不提及成员的情况下获取类型):不。在标准库中,有一个约定来提供typedef实例化类型和从它派生的类型;通常的名称是value_type,但也有例外(例如std::map)。如果你想遵守这个约定(这不是一个坏主意),你应该添加:

typedef T value_type;

到您的班级(作为公共成员),并在您需要类型时引用它,而不是某个任意成员(可能存在也可能不存在)。

于 2012-12-06T10:52:05.303 回答
1

“i”是正确的名称,可能是“int”类型?这只是一个名字!你想用这个名字做什么?

 int main () {
    C_Type<int> a  ; 
    int test=0;
    if(typeid(a.m_val) == typeid(test))
      cout <<"Int"<<endl;
 }
于 2012-12-06T10:39:00.807 回答
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
}
于 2012-12-06T11:07:03.587 回答