Класс с динамическим шаблонным полем

Ya Zaregalsya

Известный
Автор темы
370
131
Часто возникает задача когда нужно создать несколько классов, у которых будут одинаковые названия методов, но разная их реализация, а потом работать с ними так, будто это один класс. Очевидным решением в такой ситуации становятся шаблоны:


C++:
class A
{
public:
    int get()
    {
        return 0;
    }
};

class B
{
public:
   int get()
    {
        return 1;
    }
};


template<typename T>
class C
{
public:
    T obj;
    void main()
    {
        std::cout << obj.get() << std::endl;
    }
};

Но допустим, тип поля obj должен определяться условно и не просто во время работы программы, а уже после создания экземпляра класса C без его разрушения, кол-во возможных типов при этом может быть ограничено. Сейчас приходится нагромождать кучу костылей: сначала создавать enum ClassType с названиями всех типов, потом в классе C создавать поле для каждого типа (A objA, B obj B), а потом в каждой функции мучиться с оператором switch(ClassType) — это неудобно и выглядит отвратительно. Потребность ведь совсем ненадуманная, она может возникнуть в любой большой программе. Как в таком случае организуют код опытные разработчики?
 
Решение
Тогда ведь будут вызываться методы get() базового класса, разве нет?
нет, при вызове виртуального метода по ссылке или указателю срабатывает динамический полиморфизм и вызовется реализация метода для дочернего класса

Ya Zaregalsya

Известный
Автор темы
370
131
Наследуйся от общего класса с виртуальным методом get() и переопределяй в дочерних. А поле делай как unique_ptr на базовый класс
Тогда ведь будут вызываться методы get() базового класса, разве нет?
 

memir

🇷🇺
Всефорумный модератор
332
594
Тогда ведь будут вызываться методы get() базового класса, разве нет?
нет, при вызове виртуального метода по ссылке или указателю срабатывает динамический полиморфизм и вызовется реализация метода для дочернего класса
 
  • Нравится
Реакции: Ya Zaregalsya