2017-01-28 10 views
1

У меня есть класс AttributeЗнать тип производного класса базового указателя в аргументе внутри функции?

class Attribute {}; 

, который является базовым классом некоторых классов, как

class Place : public Attribute {}; 
class Time : public Attribute {}; 
class Way: public Attribute {}; 

Тогда у меня есть два initializer_lists

Place* place = new Place(); 
Time* time = new Time(); 
Way* way = new Way(); 
auto il1 = std::initializer_list<Attribute*>({ place, time }); 
auto il2 = std::initializer_list<Attribute*>({ place, way }); 

Моя цель состоит в том, чтобы знать элементы список инициализаторов, которые относятся к типу элементов второго initializer_list.

Один из способов сделать это делают что-то вроде

bool isFirstElementAPlace = (dynamic_cast<Place*>(*(l.begin())) ? true : false); 

Place* Но следует заменить typeid(*(il2.begin())), но информация типа, возвращаемая ней Attribute*, не Place* или так. Таким образом, этот ответ недействителен.


Есть ли способ, чтобы обобщенно знать тип производного класса указателя базового класса внутри аргумента в initializer_list?

РЕШИТЬ В THIS QUESTION

+0

[станд :: type_info] (Http: // en.cppreference.com/w/cpp/types/type_info)? – Amadeus

+0

Объясните свой вопрос более подробно. Вы хотите переключиться с несколькими случаями? Почтовый код, который вы хотели бы видеть, возможно, с неправильным синтаксисом. –

ответ

1

Использование шаблона:

template <typename T> 
bool isType(Attribute* a) { 
    return dynamic_cast<T*>(a); 
} 

Затем вы можете проверить тип, как это:

bool isFirstElementAPlace = isType<Place>(*(l.begin())); 
+0

Но что, если я ищу типы в другом 'initializer_list '? – Garmekain