Активировать актера-феникса как вызываемый фьюжн объект - PullRequest
0 голосов
/ 06 октября 2011

Мне было интересно, можно ли создать актеров, которых можно звать фениксом, и использовать их в последовательностях слияния. Учитывая следующий источник:

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

Так возможно ли это вообще с Фениксом?

1 Ответ

0 голосов
/ 06 октября 2011

Попробуйте:

#include <boost/phoenix/fusion.hpp>

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

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