struct empty_t{};
template <class I, class B=empty_t>
class Visitable:public B {
public:
// ...
struct X : Visitable<X>{
};
struct A : Visitable<A,X> {};
struct B : Visitable<B,X> {};
Обратите внимание, что отправка здесь является статической. И ваш вектор содержит X
с, а не A
с или B
с.
Вы, вероятно, хотите
template <class Visitor>
struct IVisitable {
virtual void accept(Visitor const& v) const = 0;
protected:
~IVisitable(){}
};
template <class I, class Visitor, class B=IVisitable<Visitor>>
struct Visitable {
virtual void accept(Visitor const& v) const override {
v.visit(static_cast<const I&>(*this));
}
};
, который становится ближе.
struct A; struct B; struct X;
struct X:Visitable<X, Visitor<A,B,X>> {
};
struct A :Visitable<A, Visitor<A,B,X>, X> {};
struct B :Visitable<B, Visitor<A,B,X>, X> {};
это все еще не делает то, что вы хотите, потому что у вас есть вектор значений. А полиморфные значения требуют больше работы.
Сделайте его вектором уникальных ptrs для X и добавьте virtual ~X(){}
и несколько *
и make_unique
s, и это будет делать то, что вы хотите.