#include <iostream>
#include <iomanip>
enum class EnumClass { A, B = 4, C = 9, D = 60 };
template <int I> struct check_enum { static const bool value = false; };
template <> struct check_enum<static_cast<int>(EnumClass::A)> { static const bool value = true; };
template <> struct check_enum<static_cast<int>(EnumClass::B)> { static const bool value = true; };
template <> struct check_enum<static_cast<int>(EnumClass::C)> { static const bool value = true; };
template <> struct check_enum<static_cast<int>(EnumClass::D)> { static const bool value = true; };
template <int I> constexpr bool is_value_valid = false;
template <> constexpr bool is_value_valid<static_cast<int>(EnumClass::A)> = true;
template <> constexpr bool is_value_valid<static_cast<int>(EnumClass::B)> = true;
template <> constexpr bool is_value_valid<static_cast<int>(EnumClass::C)> = true;
template <> constexpr bool is_value_valid<static_cast<int>(EnumClass::D)> = true;
int main(int, char **)
{
static_assert(check_enum<0>::value, "invalid enum value"); // ok!
static_assert(check_enum<1>::value, "invalid enum value"); // compile error
static_assert(is_value_valid<0>, "invalid enum value"); // ok!
static_assert(is_value_valid<1>, "invalid enum value"); // compile error
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCmVudW0gY2xhc3MgRW51bUNsYXNzIHsgQSwgQiA9IDQsIEMgPSA5LCBEID0gNjAgfTsKCnRlbXBsYXRlIDxpbnQgST4gc3RydWN0IGNoZWNrX2VudW0geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOyB9Owp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgY2hlY2tfZW51bTxzdGF0aWNfY2FzdDxpbnQ+KEVudW1DbGFzczo6QSk+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9Owp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgY2hlY2tfZW51bTxzdGF0aWNfY2FzdDxpbnQ+KEVudW1DbGFzczo6Qik+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9Owp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgY2hlY2tfZW51bTxzdGF0aWNfY2FzdDxpbnQ+KEVudW1DbGFzczo6Qyk+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9Owp0ZW1wbGF0ZSA8PiBzdHJ1Y3QgY2hlY2tfZW51bTxzdGF0aWNfY2FzdDxpbnQ+KEVudW1DbGFzczo6RCk+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OwoKdGVtcGxhdGUgPGludCBJPiBjb25zdGV4cHIgYm9vbCBpc192YWx1ZV92YWxpZCA9IGZhbHNlOwp0ZW1wbGF0ZSA8PiBjb25zdGV4cHIgYm9vbCBpc192YWx1ZV92YWxpZDxzdGF0aWNfY2FzdDxpbnQ+KEVudW1DbGFzczo6QSk+ID0gdHJ1ZTsKdGVtcGxhdGUgPD4gY29uc3RleHByIGJvb2wgaXNfdmFsdWVfdmFsaWQ8c3RhdGljX2Nhc3Q8aW50PihFbnVtQ2xhc3M6OkIpPiA9IHRydWU7CnRlbXBsYXRlIDw+IGNvbnN0ZXhwciBib29sIGlzX3ZhbHVlX3ZhbGlkPHN0YXRpY19jYXN0PGludD4oRW51bUNsYXNzOjpDKT4gPSB0cnVlOwp0ZW1wbGF0ZSA8PiBjb25zdGV4cHIgYm9vbCBpc192YWx1ZV92YWxpZDxzdGF0aWNfY2FzdDxpbnQ+KEVudW1DbGFzczo6RCk+ID0gdHJ1ZTsKCmludCBtYWluKGludCwgY2hhciAqKikKewogICAgc3RhdGljX2Fzc2VydChjaGVja19lbnVtPDA+Ojp2YWx1ZSwgImludmFsaWQgZW51bSB2YWx1ZSIpOyAvLyBvayEKICAgIHN0YXRpY19hc3NlcnQoY2hlY2tfZW51bTwxPjo6dmFsdWUsICJpbnZhbGlkIGVudW0gdmFsdWUiKTsgLy8gY29tcGlsZSBlcnJvcgoKICAgIHN0YXRpY19hc3NlcnQoaXNfdmFsdWVfdmFsaWQ8MD4sICJpbnZhbGlkIGVudW0gdmFsdWUiKTsgLy8gb2shCiAgICBzdGF0aWNfYXNzZXJ0KGlzX3ZhbHVlX3ZhbGlkPDE+LCAiaW52YWxpZCBlbnVtIHZhbHVlIik7IC8vIGNvbXBpbGUgZXJyb3IKCiAgICByZXR1cm4gMDsKfQ==
prog.cpp: In function 'int main(int, char**)':
prog.cpp:15:5: error: static assertion failed: invalid enum value
static_assert(check_enum<1>::value, "invalid enum value"); // compile error
^