Имея —
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
)
Имя, возвращаемое TypeId :: имя это зависит от компилятора и для некоторых компиляторов это нечто ужасное (например, i
за int
). Большинство компиляторов поддерживают разделение имен, что приводит к более хорошему представлению, но все еще бесполезно для программного использования.
Вот список API-интерфейсов для разборки для распространенных компиляторов:
В ответ на ваш последний вопрос (касательно получения типа
без обращения к члену): нет. В стандартной библиотеке
существует соглашение о предоставлении typedef
для
тип экземпляра и типы, производные от него; обычное имя
является value_type
но есть исключения (например, std::map
). Если
Вы хотите придерживаться этого соглашения (что не является плохой идеей),
Вы должны добавить:
typedef T value_type;
к вашему классу (как публичный участник), и обращайтесь к нему, когда вы
хотите тип, а не какой-то произвольный член (который может или
может не присутствовать).
«я» правильное имя может быть типа «INT»?
это просто имя! Что вы хотите сделать с именем?
int main () {
C_Type<int> a ;
int test=0;
if(typeid(a.m_val) == typeid(test))
cout <<"Int"<<endl;
}
Если вам нужно получить параметр шаблона из спецификации шаблона (и у вас есть 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
}