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() {}
ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPgogICAgc3RydWN0IFNvbWVCYXNlIHt9OwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPgogICAgc3RydWN0IFNvbWVCYXNlRmFjdG9yeSB7CiAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgogICAgICBzdHJ1Y3QgYXBwbHkgeyB0eXBlZGVmIFNvbWVCYXNlPERlcml2ZWQsIFgsIFk+IHR5cGU7IH07CiAgICB9OwoKICAgIC8vIEdlbmVyaWMgYXBwbGljYXRpb24KICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBGYWMsIHR5cGVuYW1lIERlcml2ZWQ+CiAgICBzdHJ1Y3QgYXBwbHkgewogICAgICB0eXBlZGVmIHR5cGVuYW1lIEZhYzo6dGVtcGxhdGUgYXBwbHk8RGVyaXZlZD46OnR5cGUgdHlwZTsKICAgIH07CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CiAgICBzdHJ1Y3QgRm9vOiBhcHBseTxBcmdzLCBGb288QXJncy4uLj4+Ojp0eXBlLi4uIHsKICAgIH07CgogICAgdHlwZWRlZiBGb288IFNvbWVCYXNlRmFjdG9yeTxpbnQsIGZsb2F0PiA+IFN1cGVyRm9vOwoKICAgIGludCBtYWluKCkge30=