0
     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);
}

当我们尝试将指针转换为 char 时,上面的代码工作正常并给出编译时错误。但它不是很清楚 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;

如果有人有清楚的了解,请解释

4

1 回答 1

0

我们对CompileTimeError<true>具有默认构造函数的类进行了专门化。其他情况的实例将导致错误,即CompileTimeError<not true>未定义类型(在您的情况下,我们尝试创建ERROR_Destination_Type_Too_Narrow类型变量CompileTimeError<false>)。(void)VariableName只是-Wunused的沉默

于 2013-01-14T08:24:21.277 回答