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;
明確に理解できる人は説明してください