// Copyright 2017 <Biagio Festa>
#include <iostream>
#include <type_traits>
struct CriticalError : std::true_type {
static constexpr bool is_critical = true;
};
struct Warning : std::false_type {
static constexpr bool is_critical = false;
};
template<typename ErrorPolicy>
void foo() {
if constexpr (ErrorPolicy::is_critical) {
std::cout << "Critical\n";
} else {
std::cout << "NotCritical\n";
}
if constexpr (std::is_base_of<std::true_type, ErrorPolicy>::value) {
std::cout << "Critical\n";
} else {
std::cout << "NotCritical\n";
}
// ...
}
int main(int argc, char *argv[]) {
foo<CriticalError>();
foo<Warning>();
return 0;
}
Ly8gQ29weXJpZ2h0IDIwMTcgPEJpYWdpbyBGZXN0YT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgQ3JpdGljYWxFcnJvciA6IHN0ZDo6dHJ1ZV90eXBlIHsKICBzdGF0aWMgY29uc3RleHByIGJvb2wgaXNfY3JpdGljYWwgPSB0cnVlOwp9OwoKc3RydWN0IFdhcm5pbmcgOiBzdGQ6OmZhbHNlX3R5cGUgewogIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBpc19jcml0aWNhbCA9IGZhbHNlOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgRXJyb3JQb2xpY3k+CnZvaWQgZm9vKCkgewogIGlmIGNvbnN0ZXhwciAoRXJyb3JQb2xpY3k6OmlzX2NyaXRpY2FsKSB7CiAgICAgIHN0ZDo6Y291dCA8PCAiQ3JpdGljYWxcbiI7CiAgICB9IGVsc2UgewogICAgc3RkOjpjb3V0IDw8ICJOb3RDcml0aWNhbFxuIjsKICB9CiAgCiAgaWYgY29uc3RleHByIChzdGQ6OmlzX2Jhc2Vfb2Y8c3RkOjp0cnVlX3R5cGUsIEVycm9yUG9saWN5Pjo6dmFsdWUpIHsKICAgICAgc3RkOjpjb3V0IDw8ICJDcml0aWNhbFxuIjsKICAgIH0gZWxzZSB7CiAgICBzdGQ6OmNvdXQgPDwgIk5vdENyaXRpY2FsXG4iOwogIH0KICAvLyAuLi4KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogIGZvbzxDcml0aWNhbEVycm9yPigpOwogIGZvbzxXYXJuaW5nPigpOwogIHJldHVybiAwOwp9Cg==