ここをキャンプ地とするブログ

いきあたりばったり

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 を抽象化すれば他のいろんな型でも出来そう。


なんか、もっと上手い方法もありそうな気がするけど・・・。

これもテンプレートメタプログラミング