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:
Post a Comment