#include <iostream>
#include <type_traits>
using namespace std;
// должно было быть enum E { A, Q, R };
// не должно быть enum E { X, Y, Z };
enum E { A, B, C, Z } ;
int R; // случайно определили вне энума
int Y;
// для тех имён, которые нигде не определены "по-настоящему", сделаем затычку
namespace last_chance { enum EE { X, Z } ; }
void checker( ) {
using namespace last_chance; // задействуем затычку
// white list
static_assert( std:: is_same < :: E , decltype( A) > :: value , "A is not defined" ) ;
static_assert( std:: is_same < :: E , decltype( Q) > :: value , "A is not defined" ) ; // ERROR
static_assert( std:: is_same < :: E , decltype( R) > :: value , "A is not defined" ) ; // ERROR
// black list
static_assert( ! std:: is_same < :: E , decltype( X) > :: value , "X is defined!" ) ;
static_assert( ! std:: is_same < :: E , decltype( Y) > :: value , "Y is defined!" ) ;
static_assert( ! std:: is_same < :: E , decltype( Z) > :: value , "Z is defined!" ) ; // ERROR
}
int main( ) {
// your code goes here
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyDQtNC+0LvQttC90L4g0LHRi9C70L4g0LHRi9GC0YwgZW51bSBFIHsgQSwgUSwgUiB9OwovLyDQvdC1INC00L7Qu9C20L3QviDQsdGL0YLRjCBlbnVtIEUgeyBYLCBZLCBaIH07CmVudW0gRSB7IEEsIEIsIEMsIFogfTsKaW50IFI7IC8vINGB0LvRg9GH0LDQudC90L4g0L7Qv9GA0LXQtNC10LvQuNC70Lgg0LLQvdC1INGN0L3Rg9C80LAKCmludCBZOwovLyDQtNC70Y8g0YLQtdGFINC40LzRkdC9LCDQutC+0YLQvtGA0YvQtSDQvdC40LPQtNC1INC90LUg0L7Qv9GA0LXQtNC10LvQtdC90YsgItC/0L4t0L3QsNGB0YLQvtGP0YnQtdC80YMiLCDRgdC00LXQu9Cw0LXQvCDQt9Cw0YLRi9GH0LrRgwpuYW1lc3BhY2UgbGFzdF9jaGFuY2UgeyBlbnVtIEVFIHsgWCwgWiB9OyB9Cgp2b2lkIGNoZWNrZXIoKSB7Cgl1c2luZyBuYW1lc3BhY2UgbGFzdF9jaGFuY2U7IC8vINC30LDQtNC10LnRgdGC0LLRg9C10Lwg0LfQsNGC0YvRh9C60YMKCQoJLy8gd2hpdGUgbGlzdAoJc3RhdGljX2Fzc2VydCggc3RkOjppc19zYW1lPDo6RSwgZGVjbHR5cGUoQSk+Ojp2YWx1ZSwgIkEgaXMgbm90IGRlZmluZWQiICk7CglzdGF0aWNfYXNzZXJ0KCBzdGQ6OmlzX3NhbWU8OjpFLCBkZWNsdHlwZShRKT46OnZhbHVlLCAiQSBpcyBub3QgZGVmaW5lZCIgKTsgLy8gRVJST1IKCXN0YXRpY19hc3NlcnQoIHN0ZDo6aXNfc2FtZTw6OkUsIGRlY2x0eXBlKFIpPjo6dmFsdWUsICJBIGlzIG5vdCBkZWZpbmVkIiApOyAvLyBFUlJPUgoJCgkvLyBibGFjayBsaXN0CglzdGF0aWNfYXNzZXJ0KCAhc3RkOjppc19zYW1lPDo6RSwgZGVjbHR5cGUoWCk+Ojp2YWx1ZSwgIlggaXMgZGVmaW5lZCEiICk7CglzdGF0aWNfYXNzZXJ0KCAhc3RkOjppc19zYW1lPDo6RSwgZGVjbHR5cGUoWSk+Ojp2YWx1ZSwgIlkgaXMgZGVmaW5lZCEiICk7CglzdGF0aWNfYXNzZXJ0KCAhc3RkOjppc19zYW1lPDo6RSwgZGVjbHR5cGUoWik+Ojp2YWx1ZSwgIlogaXMgZGVmaW5lZCEiICk7IC8vIEVSUk9SCn0KCgppbnQgbWFpbigpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9
compilation info
prog.cpp: In function 'void checker()':
prog.cpp:19:44: error: 'Q' was not declared in this scope
static_assert( std::is_same<::E, decltype(Q)>::value, "A is not defined" ); // ERROR
^
prog.cpp:19:46: error: template argument 2 is invalid
static_assert( std::is_same<::E, decltype(Q)>::value, "A is not defined" ); // ERROR
^
prog.cpp:20:2: error: static assertion failed: A is not defined
static_assert( std::is_same<::E, decltype(R)>::value, "A is not defined" ); // ERROR
^
prog.cpp:25:47: error: template argument 2 is invalid
static_assert( !std::is_same<::E, decltype(Z)>::value, "Z is defined!" ); // ERROR
^
stdout