Получить тип, из которого состоит шаблонный класс

Имея —

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)

3

Решение

Имя, возвращаемое TypeId :: имя это зависит от компилятора и для некоторых компиляторов это нечто ужасное (например, i за int). Большинство компиляторов поддерживают разделение имен, что приводит к более хорошему представлению, но все еще бесполезно для программного использования.

Вот список API-интерфейсов для разборки для распространенных компиляторов:

5

Другие решения

В ответ на ваш последний вопрос (касательно получения типа
без обращения к члену): нет. В стандартной библиотеке
существует соглашение о предоставлении typedef для
тип экземпляра и типы, производные от него; обычное имя
является value_typeно есть исключения (например, std::map). Если
Вы хотите придерживаться этого соглашения (что не является плохой идеей),
Вы должны добавить:

typedef T value_type;

к вашему классу (как публичный участник), и обращайтесь к нему, когда вы
хотите тип, а не какой-то произвольный член (который может или
может не присутствовать).

3

«я» правильное имя может быть типа «INT»?
это просто имя! Что вы хотите сделать с именем?

 int main () {
C_Type<int> a  ;
int test=0;
if(typeid(a.m_val) == typeid(test))
cout <<"Int"<<endl;
}
1

Если вам нужно получить параметр шаблона из спецификации шаблона (и у вас есть 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
}
0
По вопросам рекламы [email protected]