変数と同じ値の定数をテンプレート引数に渡す。

つまり以下のようになる。

template <int N>
void Function();

void Call(int n /* 0-2 */) {
    if (n == 0) {
        Function<0>();
    } else if (n == 1) {
        Function<1>();
    } else if (n == 2) {
        Function<2>();
    }
}

Callに渡された変数nに対応するFunctionを呼び出す。
予め渡される値毎に対応する静的なコードを書いておくしかない。
しかしながらこのコードは冗長であり避けたい。

そこで以下のようにすることでコードの重複を避けジェネリックに出来る。

template <int Max>
struct cross_switch {
    void operator()(int n) {
        static const int N = Max-1;
        if (N == n) {
            Function<N>();
        } else {
            cross_switch<N>()(n);
        }
    }
};
template<> struct cross_switch<0> {
    void operator()(int) {}
};

void Call(int n /* 0-2 */) {
    cross_switch<3>()(n);
}

また途中でboost::mpl::vector等の型リストを経由し、整数定数をindexに使用すれば
テンプレート引数に整数定数以外の型を渡すことも可能になる。

注意点:コードが膨張しやすい