#include <iostream>
using namespace std;
template <typename T>
struct check_valid_type {
typedef void type;
};
struct foo;
template <typename T, typename I=void>
struct bar {
std::string get_int() {
std::cout << "Invoking 1" << std::endl;
return "--";
}
};
template <typename T>
struct bar<T, typename check_valid_type<decltype(T::x)>::type> {
std::string get_int() {
std::cout << "Invoking 2" << std::endl;
return T::x;
}
};
int main() {
// your code goes here
bar<foo> y;
std::cout << y.get_int() << std::endl;
return 0;
}
struct foo {
static constexpr const char* x = "hello";
};
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgY2hlY2tfdmFsaWRfdHlwZSB7CiAgICAgICAgdHlwZWRlZiB2b2lkIHR5cGU7Cn07CgpzdHJ1Y3QgZm9vOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEk9dm9pZD4Kc3RydWN0IGJhciB7CglzdGQ6OnN0cmluZyBnZXRfaW50KCkgewoJCXN0ZDo6Y291dCA8PCAiSW52b2tpbmcgMSIgPDwgc3RkOjplbmRsOwoJCXJldHVybiAiLS0iOwoJfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBiYXI8VCwgdHlwZW5hbWUgY2hlY2tfdmFsaWRfdHlwZTxkZWNsdHlwZShUOjp4KT46OnR5cGU+IHsKCXN0ZDo6c3RyaW5nIGdldF9pbnQoKSB7CgkJc3RkOjpjb3V0IDw8ICJJbnZva2luZyAyIiA8PCBzdGQ6OmVuZGw7CgkJcmV0dXJuIFQ6Ong7Cgl9Cn07CgoKCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJYmFyPGZvbz4geTsKCXN0ZDo6Y291dCA8PCB5LmdldF9pbnQoKSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQoKc3RydWN0IGZvbyB7CglzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIHggPSAiaGVsbG8iOwkKfTsKCg==