Я не совсем уверен, что понял проблему, поэтому позвольте мне перефразировать ее, чтобы мы могли начать с правой ноги.
Вам необходимо связать производный тип с базовыми классами, в типичном случае использования CRTP, и в то же время передать другой параметр шаблона различным базовым классам.
То есть типичный базовый класс будет:
template <typename Derived, typename X, typename Y>
struct SomeBase {
};
И вам нужно создать свой тип, чтобы вы могли контролировать X
и Y
и одновременно проходить полный класс Derived
.
Думаю, я бы использовал трюк apply
для генерации базового класса на лету из адаптера, предоставленного в списке аргументов класса Derived
.
template <typename Derived, typename X, typename Y>
struct SomeBase {};
template <typename X, typename Y>
struct SomeBaseFactory {
template <typename Derived>
struct apply { typedef SomeBase<Derived, X, Y> type; };
};
// Generic application
template <typename Fac, typename Derived>
struct apply {
typedef typename Fac::template apply<Derived>::type type;
};
Затем вы должны создать тип как:
typedef MyFoo< SomeBaseFactory<int, float> > SuperFoo;
Где Foo
определяется как:
template <typename... Args>
struct Foo: apply<Args, Foo<Args...>>::type... {
};
И только из-за того, что я долго так тщательно разбирался в шаблонах, Я проверил, как это работает .
Конечно, Factory
сам по себе не является специфическим для данного типа, поэтому мы можем использовать подход оболочки, который вы экспериментировали:
template <template <typename...> class M, typename... Args>
struct Factory {
template <typename Derived>
struct apply { typedef M<Derived, Args...> type; };
};
И да, тоже работает .