C++でint型の2値が異なるとコンパイルエラーになるトリック
ちょっとあると便利な場面に遭遇したので考えてみた。
//----------------------------------------------------------------------------- // iとjが異なるとコンパイルエラーになるトリック //----------------------------------------------------------------------------- template<int i> struct SIntCheckElem{}; template<int i, int j> struct SIntCheck{ SIntCheckElem<i> val0; SIntCheckElem<j> val1; SIntCheck(){ val0 = val1; } }; //-----------------------------------------------------------------------------
んで、こんな感じに使う。
SIntCheck<0,0> tmp; //ok SIntCheck<0,1> tmp; //コンパイルエラー!
要は i と j を templete 構造体の型として持たせて、代入式が成立するかっていう原理。
もちろん、i と j はコンパイル時には確定する定数である必要がある。
もう一枚 templete かまして、int を抽象化すれば他のいろんな型でも出来そう。
なんか、もっと上手い方法もありそうな気がするけど・・・。
これもテンプレートメタプログラミング?