template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};#define STATIC_CHECK(expr,msg) {CompileTimeError< ((expr)!=0) > Error_##msg; (void)Error_##msg; }
template <class To , class From>
To safe_reinterpret_cast(From from)
{
STATIC_CHECK(sizeof(From) <= sizeof(To),Destination_Type_Too_Narrow);
return reinterpret_cast<To>(from);
}
void main()
{
void *p= NULL;
char c= safe_reinterpret_cast<char>(p);
}
Приведенный выше код работает нормально и выдает ошибку времени компиляции, когда мы пытаемся преобразовать указатель в символ.
Но не очень понятно, как работает макрос STATIC_CHECK.
В соответствии с приведенным выше кодом это должно привести к следующим
STATC_CHECK(false,Destination_Type_Too_Narrow)
Выше макрос будет расширен следующим образом:
CompileTimeError<false>
ERROR_Destination_Type_Too_Narrow;
(void)ERROR_Destination_Type_Too_Narrow;
В приведенном выше макросе я не могу понять, для чего предназначены эти два утверждения
ERROR_Destination_Type_Too_Narrow;
(void)ERROR_Destination_Type_Too_Narrow;
Если кто-то имеет ясное понимание, пожалуйста, объясните
У нас есть специализация для класса CompileTimeError<true>
, который имеет конструктор по умолчанию. Экземпляры других случаев приведут к ошибке, что CompileTimeError<not true>
это неопределенный тип (в вашем случае мы пытаемся создать переменную ERROR_Destination_Type_Too_Narrow
типа CompileTimeError<false>
). (void)VariableName
это только молчание
Других решений пока нет …