将凤凰演员作为融合可调对象

时间:2011-10-06 13:03:32

标签: c++ boost c++11 boost-fusion boost-phoenix

我想知道是否有可能创建可调用的凤凰演员并在融合序列中使用它们。 鉴于以下来源:

struct FusionStruct
{
    void Doit() const{std::cout << "Doit" << std::endl;}
};

struct FusionCaller
{
    template <typename T> void operator()(T& x) const
    {
        x.second.Doit();
    }
};

int main()
{
    typedef boost::fusion::map<boost::fusion::pair<int, FusionStruct> > FusionMap_t;
    FusionMap_t fmap(boost::fusion::make_pair<int>(FusionStruct()));
    boost::fusion::for_each(fmap, FusionCaller());
    return 0;
}

这可以按预期工作 但是因为我可以像这样在凤凰中创建多态可调用的演员:

auto p = (boost::phoenix::placeholders::arg1 * boost::phoenix::placeholders::arg1);
// int and double are fine
std::cout << p(2,2) << std::endl;
std::cout << p(2.0,2.0) << std::endl;

我想知道我是否可以使用凤凰来摆脱我的FusionCaller结构。像这样: fusion::for_each(fmap, /* some magic phoenix expression*/);

这对凤凰有可能吗?

1 个答案:

答案 0 :(得分:0)

尝试:

#include <boost/phoenix/fusion.hpp>

using boost::phoenix::arg_names::arg1;

fusion::for_each(fmap, boost::phoenix::at_c<1>(arg1).DoIt() );