了解Loki库中的STATIC_CHECK

understanding STATIC_CHECK in Loki library

本文关键字:STATIC CHECK Loki 了解      更新时间:2023-10-16
     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;

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

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