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;

上記のマクロでは、これら2つのステートメントが何を意味するのか理解できません

 ERROR_Destination_Type_Too_Narrow;
    (void)ERROR_Destination_Type_Too_Narrow;

明確に理解できる人は説明してください

4

1 に答える 1

0

CompileTimeError<true>デフォルトのコンストラクターを持つclass の特殊化があります。他のケースのインスタンス化はエラーを引き起こします。つまり、未定義の型です(あなたの場合、 type のCompileTimeError<not true>変数を作成しようとしています)。-Wunusedの沈黙だけですERROR_Destination_Type_Too_NarrowCompileTimeError<false>(void)VariableName

于 2013-01-14T08:24:21.277 に答える