В приведенном ниже примере у меня есть довольно типичный пример CRTP, два разных производных класса, у которых есть метод bar
. Базовый класс имеет метод foo
который только вперед к некоторым производный bar
методИтерации по различным CRTP Методам производных классов
#include <iostream>
template<typename Derived>
class Base {
public:
void foo() {
static_cast<Derived*>(this)->bar();
}
};
class DerivedA : public Base<DerivedA> {
public:
void bar() {
::std::cout << "A\n";
}
};
class DerivedB : public Base<DerivedB> {
public:
void bar() {
::std::cout << "B\n";
}
};
int main() {
DerivedA a;
DerivedB b;
a.foo();
b.foo();
}
Это не кажется, что я могу иметь массив/вектор/и т.д. базового класса, поскольку он должен был бы иметь тип вдоль линий Base<T>
где T
отличается
есть ли какое-то конвенция без virtual
для возможности перебрать различные производные классы при условии, все они имеют один и тот же метод (bar
в данном случае)?
Вы опубликовали бы полный пример? Я не использовал 'boost :: variant' до – asimes
Я предполагаю, что больше не будет' Base', а остались только 'DerivedA' и' DerivedB'? – asimes
@asimes: ОК, я немного изменил свой ответ как полную, управляемую программу, если вы объедините ее с определениями классов. Неважно, есть ли у вас 'Base' или нет - мой код работает в любом случае. –