使用boost :: fusion :: fold将boost :: fusion :: set转换为boost :: fusion :: map

时间:2011-07-16 18:57:43

标签: c++ boost boost-fusion

我有一个融合集,并希望将其转换为融合图。

#include <cstdlib>
#include <iostream>

#include <boost/fusion/include/fold.hpp>
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/make_map.hpp>
#include <boost/fusion/include/push_back.hpp>
#include <boost/fusion/include/pair.hpp>
#include <boost/fusion/container/set.hpp>
#include <boost/fusion/include/for_each.hpp>
#include <boost/fusion/include/at_key.hpp>

struct node_base
{
    int get() {return 123;}
};
struct node_a : public node_base
{
node_a(){std::cout << "node_a::Ctor"<< std::endl;}
};
struct node_b : public node_base
{
node_b(){std::cout << "node_b::Ctor"<< std::endl;}
};
struct node_c : public node_base
{
node_c(){std::cout << "node_c::Ctor"<< std::endl;}
};

typedef ::boost::fusion::set<node_a,node_b,node_c> my_fusion_set;
my_fusion_set my_set;

struct push_back_map
{
    typedef ::boost::fusion::map<> result_type;

    template<class NODE>
    ::boost::fusion::map<> operator() (const ::boost::fusion::map<> & m, const NODE & n)
    {
    return ::boost::fusion::push_back(
        m
        , ::boost::fusion::make_pair<NODE>(n)
        );
    }
};

::boost::fusion::map<> my_map =
::boost::fusion::fold(
    my_set
    , ::boost::fusion::map<>()
    , push_back_map()
    );

struct print_map
{
    template<class P>
    void operator()(P & p) const
    {
    std::cout << p.second.get() << std::endl;
    }
};

int main()
{
    ::boost::fusion::for_each(my_map, print_map());
    std::cout << ::boost::fusion::at_key<node_a>(my_set).get() << std::endl;
    //std::cout << ::boost::fusion::at_key<node_a>(my_map).second.get() << std::endl;
    system("pause");
    return 0;
}

此代码编译。但它无法打印出my_map的结果。 my_set构造成功。 my_map只是从my_set转换而来,每个元素的原始类型作为键,其实例对象来自默认构造函数作为值。我想知道my_map是否是从fusion :: fold成功创建的。 my_set能够通过调用fusion :: at_key&lt;&gt;进行查询在它上面,但my_map不适用于at_key&lt;&gt;。 谢谢!

1 个答案:

答案 0 :(得分:3)

我想不出从中创建fusion::map的简洁方法 fusion::set fold my_types。 所以这个答案不会直接解决你的问题。 我发布这个以防万一这会给你一些提示。
怎么样 准备一个类型列表(如下所示fusion::set),和 从该列表中创建fusion::mapfusion::map 而不是直接从fusion::set创建namespace bf = boost::fusion; namespace bm = boost::mpl; typedef bm::vector<node_a,node_b,node_c> my_types; typedef bm::fold< my_types , bm::vector<> , bm::push_back< bm::_1, bf::pair< bm::_2, bm::_2 > > >::type my_map_types; int main() { bf::result_of::as_set<my_types>::type my_set; bf::result_of::as_map<my_map_types>::type my_map; std::cout << bf::at_key<node_a>(my_set).get() << std::endl; std::cout << bf::at_key<node_a>(my_map).get() << std::endl; }
例如:

fusion::map

以下是对ideone的测试。 顺便提一下,如果fusion::set中的键类型和值类型始终如此 相同的,{{1}}将达到这个目的。