#include <iostream>
#include <tuple>
using namespace std;
template <typename... Args>
struct pack
{
};
template <template <typename... Args> class ENCAP, typename... Args>
struct encapsulate_arguments
{
typedef pack<ENCAP<Args>...> type;
};
template <template <typename... Args> class ENCAP, typename... Args>
struct encapsulate_arguments<ENCAP, pack<Args...>>
{
typedef pack<ENCAP<Args>...> type;
};
template <typename L>
struct Master
{
template <typename T>
struct Slave
{
typedef T type;
};
};
template <typename L>
struct Other
{
// typedef typename encapsulate_arguments<typename Master<L>::Slave, pack<double, int>>::type EmbeddedType;
typedef typename encapsulate_arguments<Master<L>::template Slave, pack<double, int>>::type EmbeddedType;
};
int main() {
encapsulate_arguments<Master<float>::Slave, pack<double, int>>::type foo;
encapsulate_arguments<Master<float>::Slave, double, int>::type bar;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IHBhY2sKewp9OwoKdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPiBjbGFzcyBFTkNBUCwgdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IGVuY2Fwc3VsYXRlX2FyZ3VtZW50cwp7Cgl0eXBlZGVmIHBhY2s8RU5DQVA8QXJncz4uLi4+IHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+IGNsYXNzIEVOQ0FQLCB0eXBlbmFtZS4uLiBBcmdzPgpzdHJ1Y3QgZW5jYXBzdWxhdGVfYXJndW1lbnRzPEVOQ0FQLCBwYWNrPEFyZ3MuLi4+Pgp7Cgl0eXBlZGVmIHBhY2s8RU5DQVA8QXJncz4uLi4+IHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgTD4JCnN0cnVjdCBNYXN0ZXIKewoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglzdHJ1Y3QgU2xhdmUKCXsKCQl0eXBlZGVmIFQgdHlwZTsJCgl9Owp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIEw+CQpzdHJ1Y3QgT3RoZXIKewovLwl0eXBlZGVmIHR5cGVuYW1lIGVuY2Fwc3VsYXRlX2FyZ3VtZW50czx0eXBlbmFtZSBNYXN0ZXI8TD46OlNsYXZlLCBwYWNrPGRvdWJsZSwgaW50Pj46OnR5cGUgRW1iZWRkZWRUeXBlOwoJdHlwZWRlZiB0eXBlbmFtZSBlbmNhcHN1bGF0ZV9hcmd1bWVudHM8TWFzdGVyPEw+Ojp0ZW1wbGF0ZSBTbGF2ZSwgcGFjazxkb3VibGUsIGludD4+Ojp0eXBlIEVtYmVkZGVkVHlwZTsKfTsKCmludCBtYWluKCkgewoJZW5jYXBzdWxhdGVfYXJndW1lbnRzPE1hc3RlcjxmbG9hdD46OlNsYXZlLCBwYWNrPGRvdWJsZSwgaW50Pj46OnR5cGUgZm9vOwoJZW5jYXBzdWxhdGVfYXJndW1lbnRzPE1hc3RlcjxmbG9hdD46OlNsYXZlLCBkb3VibGUsIGludD46OnR5cGUgYmFyOwoJcmV0dXJuIDA7Cn0K