2012-06-10 3 views
0

Я уже понял, использовать полиморфизм и иметь список хранить указатель на baseClass, но после успешного размещения там я хотел бы знать, какой класс был изначально изначально. Я использую шаблоны для классов и хотел иметь другое поле, которое было бы перечислением основных типов.Список объектов из разных классов C++

Теперь вопрос: есть ли способ, чтобы проверить (во время выполнения или во время компиляции) в

(if T == int) 
    field = INT 

я хотя, возможно, что-то с препроцессором, но я не знаком с этим.

+0

В C++ 11 есть 'decltype'. – chris

+2

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

ответ

1

Вы можете использовать оператора typeid.

Например, если T является указателем на базовый класс:

if (typeid(SomeDerivedClass) == typeid(*T)) 
... 

(. Это несколько неясно для меня, почему вы говорите о int в связи с полиморфизмом int не могут быть получены из.)

4

Вся идея полиморфизма заключается в том, чтобы скрыть конкретную реализацию, сделав ее прозрачной в потоке вашей программы. Использование типа класса в качестве индикатора сделает ваш код раздутым с операторами if и будет сложнее поддерживать.

Я предлагаю вам пересмотреть свой дизайн и создать абстрактный класс с помощью заданных методов поведения и использовать этот тип класса в качестве типа объектов списка. Чем для каждого объекта вызывается метод интерфейса (который был объявлен в абстрактном классе и реализован в классах вывода)

0

Препроцессор C++ ничего не знает о C++. Это универсальный манипулятор символов, который может использоваться с большинством любого языка программирования или, если на то пошло, любого приложения обработки текста, такого как функция обработки макета слова или уравнения.

Вы можете посмотреть в typeid operator как один из способов построения такого механизма, хотя прислушайтесь к разделу . Неправильные установки RTTI далее на этой странице.

1

То, что вы, вероятно, ищете, известно как черты характера. Они позволяют вам определять и действовать по атрибутам определенного типа. Вы можете начать с std::is_integral() и std::is_floating_point() и строить оттуда в зависимости от ваших требований.

enum Type 
{ 
    Unknown, 
    Integral, 
    Float 
}; 

.... 

Type field = Unknown; 

if(std::is_integral<T>::value) 
{ 
    field = Integral; 
} 

else if(std::is_floating_point<T>::value) 
{ 
    field = Float; 
} 
+1

Существует одна проблема с этим: 'enum' объявляется в каждом экземпляре шаблона, а' Foo :: Type', таким образом, отличается от типа Foo :: Type'. Вы должны объявить 'enum' вне шаблона и, при желании, импортировать его с помощью' typedef'. Более того, хотя это работает, перевод с типа на 'enum' должен выполняться перегрузкой функции вместо предоставления одной функции проверками времени выполнения (хотя на практике их следует оптимизировать). Для более сложного, когда требуется действие на 'T', вы столкнетесь с проблемами с этим шаблоном. –

+0

А, спасибо. Даже не подумал о размещении Типа. Я немного уменьшил его, чтобы более точно соответствовать примеру OP. Лот меньше вокруг него. –

Смежные вопросы