【问题标题】:Boost phoenix actor as a fusion callable objectBoost phoenix actor 作为一个 Fusion 可调用对象
【发布时间】:2011-10-06 13:03:32
【问题描述】:

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

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;

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

那么凤凰有可能吗?

【问题讨论】:

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


    【解决方案1】:

    试试:

    #include <boost/phoenix/fusion.hpp>
    
    using boost::phoenix::arg_names::arg1;
    
    fusion::for_each(fmap, boost::phoenix::at_c<1>(arg1).DoIt() );
    

    【讨论】:

    • 在我的 VS2010 上,我收到一个错误 error C2780: 'const boost::phoenix::detail::expression::function_eval&lt;boost::phoenix::stl::at_impl,A0,A1&gt;::type boost::phoenix::at(const A0 &amp;,const A1 &amp;)' : expects 2 arguments - 1 provided
    • 您使用的是哪个版本的 Fusion?
    • @mkaes:哦……我什至无法测试它。无论如何,我曾经问过类似的问题,现在我的问题正在解决。也许你应该看看这个话题:stackoverflow.com/questions/7337414/…
    • 我很确定您的意思是 phoenix::at_c&lt;1&gt; 而不是 phoenix::at&lt;1&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2011-04-03
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多