#include <type_traits>
#include <iostream>
struct A {
static constexpr unsigned int bar = 20;
};
struct B {
};
template <typename T,typename=void>
struct getBar {
static constexpr unsigned int bar = 0;
};
template <typename T>
struct getBar<T,std::void_t<decltype(T::bar)>> {
static constexpr unsigned int bar = T::bar;
};
int main() {
std::cout << getBar<A>::bar << std::endl; // Expect 20
std::cout << getBar<B>::bar << std::endl; //Expect 0
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8aW9zdHJlYW0+CnN0cnVjdCBBIHsKICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBiYXIgPSAyMDsKCn07CgpzdHJ1Y3QgQiB7Cgp9OwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBULHR5cGVuYW1lPXZvaWQ+CnN0cnVjdCBnZXRCYXIgewogIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGJhciA9IDA7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGdldEJhcjxULHN0ZDo6dm9pZF90PGRlY2x0eXBlKFQ6OmJhcik+PiB7CiAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQgYmFyID0gIFQ6OmJhcjsKfTsKCmludCBtYWluKCkgewogIHN0ZDo6Y291dCA8PCBnZXRCYXI8QT46OmJhciA8PCBzdGQ6OmVuZGw7IC8vIEV4cGVjdCAyMAogIHN0ZDo6Y291dCA8PCBnZXRCYXI8Qj46OmJhciA8PCBzdGQ6OmVuZGw7IC8vRXhwZWN0IDAKfQ==