使用boost :: fusion :: for_each时传递/绑定参数

时间:2011-07-29 08:38:35

标签: c++ foreach metaprogramming boost-fusion

我想在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,实现它的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

你做的是正确的方法。 C ++ 0x在这方面无济于事,例如lambda表达式不是多态的,所以在一天结束时你必须在某处编写一个模板(不幸的是,它必须在命名空间范围内,即使使用C ++ 0x),就像你使用operator()一样。

像Boost.Phoenix这样的库允许动态创建多态仿函数。例如,ref(std::cout) << arg1创建一个能够将任何类型的参数传递给std::cout的对象。在您调用成员函数时,它对您的情况没有帮助。

这是我今天第二次提到它,但我确实有一个make_overload工具允许我动态创建一个重载的仿函数。如果元素类型集很小并且不太可能改变,它可能对您的情况有所帮助。例如,假设只有两种类型AB

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);