#include <iostream>
#include <type_traits>
template <typename T>
struct id { typedef T type; };
template <typename T>
struct has_type {
private:
template <typename T1>
static id<typename T1::type> f(int);
template <typename>
static void f(...);
public:
enum { value = !std::is_void<decltype(f<T>(0))>::value };
};
template <typename T, bool B = has_type<T>::value>
struct wavefunction_collapse : wavefunction_collapse<typename T::type> {};
template <typename T>
struct wavefunction_collapse<T, false> { typedef T type; };
template <int N>
struct foo { typedef foo<N+1> type; enum { value = N }; };
template <>
struct foo<10> { enum { value = 42 }; };
int main() {
std::cout << wavefunction_collapse<foo<0>>::type::value;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGlkIHsgdHlwZWRlZiBUIHR5cGU7IH07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGhhc190eXBlIHsKcHJpdmF0ZToKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4KICAgIHN0YXRpYyBpZDx0eXBlbmFtZSBUMTo6dHlwZT4gZihpbnQpOwogICAgdGVtcGxhdGUgPHR5cGVuYW1lPgogICAgc3RhdGljIHZvaWQgZiguLi4pOwpwdWJsaWM6CiAgICBlbnVtIHsgdmFsdWUgPSAhc3RkOjppc192b2lkPGRlY2x0eXBlKGY8VD4oMCkpPjo6dmFsdWUgfTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIEIgPSBoYXNfdHlwZTxUPjo6dmFsdWU+CnN0cnVjdCB3YXZlZnVuY3Rpb25fY29sbGFwc2UgOiB3YXZlZnVuY3Rpb25fY29sbGFwc2U8dHlwZW5hbWUgVDo6dHlwZT4ge307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IHdhdmVmdW5jdGlvbl9jb2xsYXBzZTxULCBmYWxzZT4geyB0eXBlZGVmIFQgdHlwZTsgfTsKCnRlbXBsYXRlIDxpbnQgTj4Kc3RydWN0IGZvbyB7IHR5cGVkZWYgZm9vPE4rMT4gdHlwZTsgZW51bSB7IHZhbHVlID0gTiB9OyB9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IGZvbzwxMD4geyBlbnVtIHsgdmFsdWUgPSA0MiB9OyB9OwoKaW50IG1haW4oKSB7CiAgIHN0ZDo6Y291dCA8PCB3YXZlZnVuY3Rpb25fY29sbGFwc2U8Zm9vPDA+Pjo6dHlwZTo6dmFsdWU7Cn0K