Понимание STATIC_CHECK в библиотеке Loki

     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;

Если кто-то имеет ясное понимание, пожалуйста, объясните

1 ответ

Решение

У нас есть специализация для класса CompileTimeError<true>, который имеет конструктор по умолчанию. Экземпляры других случаев приведут к ошибке, что CompileTimeError<not true> это неопределенный тип (в вашем случае мы пытаемся создать переменную ERROR_Destination_Type_Too_Narrow типа CompileTimeError<false>). (void)VariableName это всего лишь тишина

Другие вопросы по тегам