Tuesday, January 31, 2006

Programming::C++::ExplicitSpecialization - if文のごとく

templateを使って、あたかもif文のような真似が出来ます。ただし通常のif文はランタイムフェーズでの条件分岐なのに対し、tepmlateを使った場合はコンパイルフェーズの条件分岐になってしまいます。どういうことかといいますと、例えば次のコードがあるとします。

struct E {
 enum EnumList {
  hoge,
  foo,
 };
};

template<E::EnumList V> struct Hoge;

template<>
struct Hoge<E::hoge>
{
 void operator()() const { std::cout << "hogeだ!" << std::endl; }
}

template<>
struct Hoge<E::foo>
{
 void operator()() const { std::cout << "fooだ!" << std::endl; }
}

template<E::EnumList V>
void func()
{
 ... // 何らかの処理をする
 Hoge<V>()();
 ...
}

これで関数funcにE::EnumList型の値を引数で与えることなく、func<E::hoge>()などと書けば、関数内でif文による分岐をしなくとも、構造体Hogeのどの特殊化された定義を使えばよいかがコンパイル時に決定できます。

funcに引数としてE::EnumList型の値を与えなくて良いので、関数呼び出し時のオーバーヘッドは多少減ります。またifブロックがなくなるので、ソースの可読性も上がります。

一方で、特殊化した構造体Hogeを定義しないといけないので、若干面倒です。そこらへんトレードオフな感じがします。

面倒ですが、C++っぽくて素敵!とか勝手に思ってるので、私はつかえる時はこの特殊化による分岐をつかっていくような気がします。

No comments: