уляции проверки утверждений на

Автор admin Пятница, 22 мая 2009 11:32

уляции проверки утверждений на стадии компиляции нужно решить еще одну задачу: вывести осмысленное сообщение об ошибке и завершить работу программы. Для прерывания работы компилятора достаточно простой ошибки компиляции; фокус заключается в том, чтобы вставить осмысленный текст в сообщение об ошибке. В следующем примере, предложенном Александреску (Alexandrescu), используется специализация шаблона, локальный класс и трюк с макросами: Шаблонное метапрограммирование 241 //: C05:StaticAssert.cpp {-g++} #include using namespace std; // Шаблон и специализация tempiate struct StaticCheck { StaticCheck(…); }: template<> struct StaticCheck{}: // Макрос (генерирует локальный класс) fdefine STATIC_CHECK(expr. msg) { \ class Error_##msg{}; \ sizeof((StaticCheck(Error_##msg()))): \ } // Обнаружение сужающих преобразований tempiate To safe cast(From from) { STATIC_CHECK(sizeof(From) <- sizeofПо). NarrowingConversion); return reinterpret_cast(from); } int mainO { void* p – 0; int i – safe_cast(p): cout « “int cast okay” « endl: //! char с – safe_cast<


Комментарии закрыты.