我想在boost :: fusion :: vector的所有元素上调用一个函数。元素的类型如下:
class A {
...
void print_with_prefix(const char *prefix) {
std::cout << prefix << *this;
}
};
可以用这种方式在每个元素上调用此函数:
// Call print_with_prefix() on a boost::fusion sequence:
struct CallPrintWithPrefix {
const char *prefix_;
CallPrintWithPrefix(const char *prefix) : prefix_(prefix) {}
template <class T> void operator()(T &element) const {
element.print_with_prefix(prefix);
}
}
template <class BoostFusionVector>
void print_all(BoostFusionVector &v, const char *prefix) {
boost::fusion::for_each(v, CallPrintWithPrefix(prefix));
}
但是,print_all()
包含帮助程序类的实现非常难看,看起来过于复杂!假设允许C ++ 0x,实现它的正确方法是什么?
答案 0 :(得分:3)
你做的是正确的方法。 C ++ 0x在这方面无济于事,例如lambda表达式不是多态的,所以在一天结束时你必须在某处编写一个模板(不幸的是,它必须在命名空间范围内,即使使用C ++ 0x),就像你使用operator()
一样。
像Boost.Phoenix这样的库允许动态创建多态仿函数。例如,ref(std::cout) << arg1
创建一个能够将任何类型的参数传递给std::cout
的对象。在您调用成员函数时,它对您的情况没有帮助。
这是我今天第二次提到它,但我确实有一个make_overload
工具允许我动态创建一个重载的仿函数。如果元素类型集很小并且不太可能改变,它可能对您的情况有所帮助。例如,假设只有两种类型A
和B
:
auto overload = make_overload(
[prefix](A& a)
{ a.print_with_prefix(prefix); }
, [prefix](B& c)
{ b.print_with_prefix(prefix); } );
boost::fusion::for_each(v, overload);