#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 {
static std::string get_x() {
std::cout << "Invoking 1" << std::endl;
return "--";
}
};
template <typename T>
struct bar<T, typename check_valid_type<decltype(T::x)>::type> {
static std::string get_x() {
std::cout << "Invoking 2" << std::endl;
return T::x;
}
};
template <typename T>
struct bar<T*, void> {
static std::string get_x() {
return bar<T>::get_x();
}
};
int main() {
// your code goes here
//bar<foo> y;
bar<foo*> z;
std::cout << z.get_x() << std::endl;
return 0;
}
struct foo {
static constexpr const char* x = "hello";
};
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgY2hlY2tfdmFsaWRfdHlwZSB7CiAgICAgICAgdHlwZWRlZiB2b2lkIHR5cGU7Cn07CgpzdHJ1Y3QgZm9vOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEk9dm9pZD4Kc3RydWN0IGJhciB7CglzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3goKSB7CgkJc3RkOjpjb3V0IDw8ICJJbnZva2luZyAxIiA8PCBzdGQ6OmVuZGw7CgkJcmV0dXJuICItLSI7Cgl9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGJhcjxULCB0eXBlbmFtZSBjaGVja192YWxpZF90eXBlPGRlY2x0eXBlKFQ6OngpPjo6dHlwZT4gewoJc3RhdGljIHN0ZDo6c3RyaW5nIGdldF94KCkgewoJCXN0ZDo6Y291dCA8PCAiSW52b2tpbmcgMiIgPDwgc3RkOjplbmRsOwoJCXJldHVybiBUOjp4OwoJfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBiYXI8VCosIHZvaWQ+IHsKCXN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfeCgpIHsKCQlyZXR1cm4gYmFyPFQ+OjpnZXRfeCgpOwoJfQp9OwoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCgkvL2Jhcjxmb28+IHk7CgliYXI8Zm9vKj4gejsKCXN0ZDo6Y291dCA8PCB6LmdldF94KCkgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0KCnN0cnVjdCBmb28gewoJc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiB4ID0gImhlbGxvIjsJCn07Cgo=