    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;
    };

    template <typename... Args>
    struct Foo: apply<Args, Foo<Args...>>::type... {
    };

    typedef Foo< SomeBaseFactory<int, float> > SuperFoo;

    int main() {}