template<class...Ts>
struct IApply{};
template<class T0, class T1, class...Ts>
struct IApply<T0,T1,Ts...>:
IApply<T0>,IApply<T1,Ts...>
{
using IApply<T0>::apply;
using IApply<T1,Ts...>::apply;
};
template<class T0>
struct IApply<T0>{
virtual void apply(T0&)=0;
};
Далее сделайте это:
template<class Base, typename ...Ts>
class TypedNodeVisitor:public Base{};// 0 case
template<class Base, typename T1, typename ...Ts>
class TypedNodeVisitor<Base, T1, Ts...>: public TypedNodeVisitor<Base, Ts...> {
Теперь мы можем настроить нашу базу.
template<class...Ts>
struct IBase: INodeVisitor, IApply<Ts...>{};
template<class...Ts>
struct ITypeNodeVisitor:TyoedNodeVisitor<IBase<Ts...>,Ts...>{};
class DrawerVisitor : public ITypedNodeVisitor<NodeA, NodeB> {
и готово.
Также удалите приложение из TypedNodeVisitor.