2015-01-31 4 views
0

Я пытаюсь написать функцию шаблона, чтобы помочь с доступом к классам, хранящимся в древовидной структуре (модель Qt, как это бывает, но это не важно). Каждый элемент дерева получается из одного и того же класса, но есть две ветви производного класса, каждая из которых имеет свои собственные типы. Я буду использовать аналогию, скажем, у меня есть базовый класс Vehicle и два основных подкласса LandVehicle и SeaVehicle. У LandVehicles есть подклассы с функцией LandVehicle type(), возвращающие класс enum, land_vehicle_type_e, например «автомобиль», «грузовик», «скейтборд», как и SeaVehicles с sea_vehicle_type_e: «лодка», «джетски» и т. Д. Т.е. Грузовик является подклассом LandVehicle, который является подклассом Vehicle.Шаблоны, typeinfo и наследование

Мне нужна функция, чтобы вытаскивать каждый «автомобиль» из дерева или каждого «SeaVehicle». Я пытаюсь сделать это с помощью функций шаблона, избегая перечислений типов, вместо этого используя функцию typeinfo().

Мой план нападения был создать шаблон функции следующим образом:

template class< T> 
QList<QStandardItem*> MyModel::vehicles(T *vehicletype) 
{ 
    <iterating over tree items which have a function to return stored data> 
    { 

    T * data = dynamic_cast<T*> item->vehicle(); 
    if(typeinfo(data) == typeinfo(vehicletype) 
    { 
     <add to list of return values> 
    } 
    } 
} 

я теперь сомнительно это будет работать, как я намерен его. Например, можно использовать функцию следующим образом:

QList<QStandardItem*> vehicles<Vehicle>(Vehicle *myVehicle){} 

и передать его подкласс Vehicle, таких как грузовик, и ожидать, что она возвращает список Trucks (потому что TypeInfo() транспортного средства прошло в завещании быть эквивалентом «Грузовик»?) Или, так как мой тип шаблона - это «Транспортное средство», он вернет список каждого транспортного средства, так как типinfo транспортного средства будет эквивалентен «Транспортному средству»?

Мне кажется, что если шаблоны будут расширены с использованием Vehicle, то последнее будет истинным. Если это так, можете ли вы предложить лучший способ справиться с этой ситуацией, не полагаясь на инструкции switch? Я пытаюсь переработать существующую систему, которая в вышеупомянутой аналогии должна иметь дело только с LandVehicles и использует функцию type(), чтобы решить, что вернуть. Мне нужен способ обработки произвольных подклассов Vehicle() без необходимости кодирования для каждого нового типа.

Чтобы прояснить вопрос: (извините @Barry!), Я хотел бы, чтобы одна функция могла передать любой подкласс Vehicle, который вернет все остальные элементы в дереве того же типа подкласса. Я пытаюсь избежать необходимости кода отдельно для каждого производного типа.

+0

Чтобы быть более кратким: у вас есть два указателя 'Vehicle *', и вы хотите проверить, указывают ли они на объекты той же динамической тип? –

+0

У меня есть дерево указателей на производные классы. Я хочу извлечь все элементы того же типа, что и один, который я передаю динамически. – mike

+0

Является ли тип, требуемый от вызова функции, известного во время компиляции? –

ответ

0

Ну, я думаю, что я ответил на свой вопрос. Поскольку все элементы в дереве имеют один и тот же базовый класс, мне действительно не нужна функция шаблона. Я могу сравнить typeinfo() входного класса с типом каждого элемента в дереве