仮想関数のオーバーヘッドを回避するためにブーストタプルを使用しようとしていますが、完全に機能させることはできません。入力を処理しようとする「ハンドラー」のベクトルがあり、そのうちの1つがtrueを返したら、残りを呼び出したくありません。
C++11は使用できません。
まず、現在の仮想実装は次のようになります。
std::vector<Handler*> handlers;
//initialization code...
handlers.push_back(new Handler1);
handlers.push_back(new Handler2);
handlers.push_back(new Handler3);
//runtime code
for(std::vector<Handler*>::iterator iter = handlers.begin();
iter != handlers.end() && !(*iter)->handle(x); ++iter) {}
コンパイル時にすべてのタイプがあるので、次のようにこれをタプルとして表現できるようにしたいと思います。
boost::tuple<Handler1,Handler2,Handler3> handlers;
//runtime code
???
// should compile to something equivalent to:
// if(!handlers.get<0>().handle(x))
// if(!handlers.get<1>().handle(x))
// handlers.get<2>().handle(x);
理想的には、仮想関数呼び出しがなく、空の関数本体がインライン化されます。これはでほぼ可能であるように思われboost::fusion for_each
ますが、ハンドラーの1つがtrueを返すと、残りのハンドラーが呼び出されないという短絡動作が必要です。