Я пытаюсь написать функцию шаблона, чтобы помочь с доступом к классам, хранящимся в древовидной структуре (модель 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, который вернет все остальные элементы в дереве того же типа подкласса. Я пытаюсь избежать необходимости кода отдельно для каждого производного типа.
Чтобы быть более кратким: у вас есть два указателя 'Vehicle *', и вы хотите проверить, указывают ли они на объекты той же динамической тип? –
У меня есть дерево указателей на производные классы. Я хочу извлечь все элементы того же типа, что и один, который я передаю динамически. – mike
Является ли тип, требуемый от вызова функции, известного во время компиляции? –