Я пытаюсь смоделировать некоторые функции, связанные с базой данных, через наследование c ++.
В базе данных около 150 таблиц. И эти таблицы попадают в определенные группы, а таблицы внутри определенной группы можно манипулировать (запросы, записи и т. Д.) Аналогичным образом.
class BaseTable(){
//Functionalities common for all tables. Eg: a create_table method.
}
class Group1Table(): BaseTable{
//Inherits from BaseTable and overrides(virtual function) or adds new functionlities.
}
class Group2Table(): BaseTable{
//Inherits from BaseTable and overrides(virtual function) or adds new functionlities.
}
Может быть больше GroupTables, и наследование также может идти глубже.
С этим типом наследования я могу инициализировать карту следующим образом:
std::map<int, boost::shared_ptr<BaseTable> > tablesMap = boost::assign::map_list_of(1, new BaseTable(x,y,z))(2, new Group1Table(p, q, r) ....(150, new GroupXTable(a, b, c)
Таким образом, у TableMap будет карта всех 150 таблиц (для простоты я использовал простые ключи в порядке возрастания. Но ключи могут быть разными. Следовательно, вместо карт используются векторные карты). С помощью этой карты я могу выполнять итерации и вызывать такие вещи, как x-> create_table (), x-> query () и т. Д. Или когда я хочу выполнить определенное действие для конкретной таблицы, я могу просто вызвать
tablesMap[key]->action()
и полиморфизм позаботится о вызове правильной функции.
Меня беспокоит, есть ли издержки на хранение этих динамически полиморфных объектов и их использование, как я описал выше. Или я просто параноик? Обратите внимание, что на карте всегда будет фиксированное количество объектов, инициализированных один раз (~ 150, равное количеству таблиц), и я бы перебирал эти объекты и вызывал различные виртуальные функции там, где это необходимо.
Есть ли лучший способ смоделировать проблему, чтобы я мог избежать виртуальных функций? Я пытался мыслить в соответствии с CRTP (статическим полиморфизмом), но я не мог найти способ поместить объекты в карту и перебрать их, как я могу сделать с динамическим полиморфизмом.
Задача ещё не решена.
Других решений пока нет …