つまり以下のようになる。
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に使用すれば
テンプレート引数に整数定数以外の型を渡すことも可能になる。
注意点:コードが膨張しやすい