#include <cstdlib>
#include <tuple>
template<typename X> struct Y {};
template<typename T, size_t Level, size_t TermLevel> struct A;
template<typename ... Ts>
struct A<std::tuple<Y<Ts>...>, 1, 1> {};
// (B) dummy for T=tuple<int, Ts...> just to show it works for simple expansions
template<typename ... Ts, size_t Level, size_t TermLevel>
struct A<std::tuple<int, Ts...>, Level, TermLevel>
{
A<std::tuple<int, Ts...>, Level+1, TermLevel> value;
};
template<typename ... Ts, size_t Level>
struct A<std::tuple<int, Ts...>, Level, Level> {};
// (C) ambiguous partial specialization
template<typename T1, typename T2, size_t Level, size_t TermLevel>
struct A<std::tuple<Y<T1>, Y<T2> >, Level, TermLevel>
{
A<std::tuple<Y<T1>, Y<T2>>, Level+1, TermLevel> value;
};
template<typename T1, typename T2, size_t Level>
struct A<std::tuple<Y<T1>, Y<T2>>, Level, Level> {};
int main(int argc, const char *argv[])
{
A<std::tuple<int, Y<int>, Y<float>>, 0, 5> tint;
A<std::tuple<Y<int>, Y<float>>, 0, 5> tn;
return 0;
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDx0dXBsZT4KCnRlbXBsYXRlPHR5cGVuYW1lIFg+IHN0cnVjdCBZIHt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IExldmVsLCBzaXplX3QgVGVybUxldmVsPiBzdHJ1Y3QgQTsKCnRlbXBsYXRlPHR5cGVuYW1lIC4uLiBUcz4Kc3RydWN0IEE8c3RkOjp0dXBsZTxZPFRzPi4uLj4sIDEsIDE+IHt9OwoKLy8gKEIpIGR1bW15IGZvciBUPXR1cGxlPGludCwgVHMuLi4+IGp1c3QgdG8gc2hvdyBpdCB3b3JrcyBmb3Igc2ltcGxlIGV4cGFuc2lvbnMKdGVtcGxhdGU8dHlwZW5hbWUgLi4uIFRzLCBzaXplX3QgTGV2ZWwsIHNpemVfdCBUZXJtTGV2ZWw+CnN0cnVjdCBBPHN0ZDo6dHVwbGU8aW50LCBUcy4uLj4sIExldmVsLCBUZXJtTGV2ZWw+CnsKICAgIEE8c3RkOjp0dXBsZTxpbnQsIFRzLi4uPiwgTGV2ZWwrMSwgVGVybUxldmVsPiB2YWx1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIC4uLiBUcywgc2l6ZV90IExldmVsPgpzdHJ1Y3QgQTxzdGQ6OnR1cGxlPGludCwgVHMuLi4+LCBMZXZlbCwgTGV2ZWw+IHt9OwoKCi8vIChDKSBhbWJpZ3VvdXMgcGFydGlhbCBzcGVjaWFsaXphdGlvbgp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHNpemVfdCBMZXZlbCwgc2l6ZV90IFRlcm1MZXZlbD4Kc3RydWN0IEE8c3RkOjp0dXBsZTxZPFQxPiwgWTxUMj4gPiwgTGV2ZWwsIFRlcm1MZXZlbD4KewogICAgQTxzdGQ6OnR1cGxlPFk8VDE+LCBZPFQyPj4sIExldmVsKzEsIFRlcm1MZXZlbD4gdmFsdWU7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHNpemVfdCBMZXZlbD4Kc3RydWN0IEE8c3RkOjp0dXBsZTxZPFQxPiwgWTxUMj4+LCBMZXZlbCwgTGV2ZWw+IHt9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKewogICAgQTxzdGQ6OnR1cGxlPGludCwgWTxpbnQ+LCBZPGZsb2F0Pj4sIDAsIDU+IHRpbnQ7CiAgICBBPHN0ZDo6dHVwbGU8WTxpbnQ+LCBZPGZsb2F0Pj4sIDAsIDU+IHRuOwogICAgcmV0dXJuIDA7Cn0K