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

标签 c++ boost boost-fusion

我有一个 fusion 集,想将其转换为 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<> 进行查询,但 my_map 不适用于 at_key<>。 谢谢!

最佳答案

我想不出一种简洁的方法来创建 fusion::map fusion::setfold。 所以这个答案不会直接解决你的问题。 我发布此内容是为了给您一些提示。
怎么样 准备一个类型列表(如下面的my_types),以及 从该列表创建 fusion::setfusion::map 而不是直接从 fusion::set 创建 fusion::map
例如:

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

这是对 ideone 的测试。 顺便说一句,如果您的 fusion::map 中的 key-type 和 value-type 始终 相同,fusion::set 将满足该目的。

关于c++ - 使用 boost::fusion::fold 将 boost::fusion::set 转换为 boost::fusion::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6719514/

相关文章:

c++ - 使用 Boost.Program_options 的输入流运算符查找顺序

c++ - MSVS2010 链接器错误悲伤 - 不完全确定出了什么问题

c# - 编译 64 位版本的 lzo.dll

c++ - std::endl << std::flush 有目的吗?

c++ - Boost Karma:使用 boost::optional<boost::variant<...>> 编写规则

c++ - Boost Fusion 文章、示例、教程?

c++ - 将 boost::fusion::for_each 应用于具有可变函数对象的 boost::fusion::vector

Haskell 相当于 Boost.Fusion

c++ - 声明相同类型的变量并重用它们

c++ - 从 C++ dll 中创建绘图 Canvas 的最简单方法?