#include <type_traits>
template <typename T>
struct pups
{
struct inner
{
using outer = pups<T>;
};
};
template <typename T, typename = int>
struct is_pups : std::false_type {};
template <typename T>
struct is_pups<pups<T>, int> : std::true_type {};
template <typename T>
struct is_pups<T, decltype(std::declval<typename T::outer>(), int())> : is_pups<typename T::outer> {};
static_assert(is_pups<pups<float>>::value, "foo");
static_assert(is_pups<pups<float>::inner>::value, "foo");
static_assert(!is_pups<float>::value, "foo");
struct inner
{
using outer = float;
};
static_assert(!is_pups<inner>::value, "foo");
int main() {}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBwdXBzCnsKCXN0cnVjdCBpbm5lcgoJewoJCXVzaW5nIG91dGVyID0gcHVwczxUPjsKCX07Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSBpbnQ+CnN0cnVjdCBpc19wdXBzIDogc3RkOjpmYWxzZV90eXBlIHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBpc19wdXBzPHB1cHM8VD4sIGludD4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgaXNfcHVwczxULCBkZWNsdHlwZShzdGQ6OmRlY2x2YWw8dHlwZW5hbWUgVDo6b3V0ZXI+KCksIGludCgpKT4gOiBpc19wdXBzPHR5cGVuYW1lIFQ6Om91dGVyPiB7fTsKCnN0YXRpY19hc3NlcnQoaXNfcHVwczxwdXBzPGZsb2F0Pj46OnZhbHVlLCAiZm9vIik7CnN0YXRpY19hc3NlcnQoaXNfcHVwczxwdXBzPGZsb2F0Pjo6aW5uZXI+Ojp2YWx1ZSwgImZvbyIpOwpzdGF0aWNfYXNzZXJ0KCFpc19wdXBzPGZsb2F0Pjo6dmFsdWUsICJmb28iKTsKCnN0cnVjdCBpbm5lcgp7Cgl1c2luZyBvdXRlciA9IGZsb2F0Owp9OwoKc3RhdGljX2Fzc2VydCghaXNfcHVwczxpbm5lcj46OnZhbHVlLCAiZm9vIik7CgppbnQgbWFpbigpIHt9