我正在尝试使用 boost 元组来避免一些虚函数开销,但我不能让它工作。我有一个试图处理输入的“处理程序”向量,一旦其中一个返回 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
,但我需要短路行为,一旦其中一个处理程序返回 true,其余的就不会被调用。