Давайте предположим, что несколько дочерних классов для базового класса:
class Base
{
public:
void printHello() const { cout << "Hello" << endl; }
};
class Child1: public Base {};
class Child2: public Base {};
class Child3: public Base {};
..
class ChildN: public Base {};
Предположим, что вариант содержит любой из содержащихся классов:
using MyVariant = std::variant<Base, Child1, Child2, Child3, ... ChildN>;
Примечание: Интерес этого (по сравнению с простым вектором полиморфных указателей) состоит в том, чтобы все данные были в одном и том же массиве памяти, потому что они будут передаваться на устройство. В этом случае реальное содержимое каждого объекта находится в векторе, а не только указатель на некоторую heap
позицию.
Наконец, давайте предположим, что я хочу работать с полиморфной версией Base
каждого элемента vector<MyVariant>
.
std::vector<MyVariant> myVariantList;
... // Initialization
for (const MyVariant& elem: myVariantList)
{
const Base* baseElem = get_if_polymorph<Base>(elem); //HOW TO?
baseElem->printHello();
}
Примечание: Очевидно, тривиальное решение иметь оператор if
для каждого типа not намерение, потому что новые дочерние классы могут быть добавлены к MyVariant
без необходимости изменять все дальнейшие использования. (Расширяемость)
Итак, еще один способ задать вопрос:
Как управлять полиморфизмом в std :: option?