template <typename Derived, typename X, typename Y>
struct SomeBase {};
template <template <typename...> class M, typename... Args>
struct Factory {
template <typename Derived>
struct apply { typedef M<Derived, Args...> 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< Factory<SomeBase, int, float> > SuperFoo;
int main() {}
ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPgogICAgc3RydWN0IFNvbWVCYXNlIHt9OwoKICAgIHRlbXBsYXRlIDx0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4+IGNsYXNzIE0sIHR5cGVuYW1lLi4uIEFyZ3M+CiAgICBzdHJ1Y3QgRmFjdG9yeSB7CiAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkPgogICAgICBzdHJ1Y3QgYXBwbHkgeyB0eXBlZGVmIE08RGVyaXZlZCwgQXJncy4uLj4gdHlwZTsgfTsKICAgIH07CgogICAgLy8gR2VuZXJpYyBhcHBsaWNhdGlvbgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEZhYywgdHlwZW5hbWUgRGVyaXZlZD4KICAgIHN0cnVjdCBhcHBseSB7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgRmFjOjp0ZW1wbGF0ZSBhcHBseTxEZXJpdmVkPjo6dHlwZSB0eXBlOwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KICAgIHN0cnVjdCBGb286IGFwcGx5PEFyZ3MsIEZvbzxBcmdzLi4uPj46OnR5cGUuLi4gewogICAgfTsKCiAgICB0eXBlZGVmIEZvbzwgRmFjdG9yeTxTb21lQmFzZSwgaW50LCBmbG9hdD4gPiBTdXBlckZvbzsKCiAgICBpbnQgbWFpbigpIHt9