促进融合适应声明模板化的自我参照结构 [英] Boost Fusion adapt declaration for a templated self referential structure

查看:192
本文介绍了促进融合适应声明模板化的自我参照结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想声明一个自我指涉的树一样,是对数据的结构可以容纳的类型模板结构。我遇到编译错误,试图声明提振融合模板适应定义这种结构时。谁能帮助?

 的#include<&iostream的GT;
#包括LT&;串GT;
#包括LT&;内存和GT;
#包括LT&;矢量>#包括LT&;升压/ lexical_cast.hpp>
#包括LT&;升压/ dynamic_bitset.hpp>#包括LT&;升压/融合/调整/结构/ adapt_struct.hpp>
#包括LT&;升压/融合/有/ adapt_struct.hpp>一个结构
{
    INT a_val;
    A():a_val(0){}
    A(INT一个):a_val(一){}    朋友的std :: ostream的&放大器;运营商的LT;≤(的std :: ostream的和放大器;输出,A和a_obj)
    {
        输出<< a_obj.a_val;
        返回输出;
    }
};模板< typename的tree_type_t>
结构simple_tree_t
{
    simple_tree_t(){}
    simple_tree_t(tree_type_t t_obj):tree_data(t_obj){}
    tree_type_t tree_data;    的std ::矢量<的std :: shared_ptr的< tree_type_t> > sub_tree;    typedef的类型名称的std ::矢量<的std :: shared_ptr的< tree_type_t> > ::迭代器sub_tree_iterator;    sub_tree_iterator sub_tree_begin(){返回sub_tree.begin(); }
    sub_tree_iterator sub_tree_end(){返回sub_tree.end(); }    朋友的std :: ostream的&放大器;运营商的LT;≤(的std :: ostream的和放大器;输出,simple_tree_t&安培;树)
    {
        输出<< tree.tree_data;
        的std :: for_each的(tree.sub_tree_begin()
                        tree.sub_tree_end(),
                        ([安培](常量的std :: shared_ptr的< A&F)的温度{
                            输出<< *F;
                            }));
        返回输出;
    }
};BOOST_FUSION_ADAPT_STRUCT(A,
                                (INT,a_val))BOOST_FUSION_ADAPT_TPL_STRUCT((tree_type_t)
                                (simple_tree_t)(tree_type_t)
                                (tree_type_t,tree_data)
                                (类型名称的std ::矢量<的std :: shared_ptr的< tree_type_t>>,sub_tree))INT主要(无效)
{
    simple_tree_t< A> t_i,t_o;    t_i.tree_data = A(10);
    t_i.sub_tree.push_back(性病:: make_shared< A>(A(20)));
    t_i.sub_tree.push_back(性病:: make_shared< A>(A(30)));    性病::法院LT&;< t_i<<的std :: ENDL;    返回0;
}


解决方案

@cv_and_he是当场上; 住在Coliru

  BOOST_FUSION_ADAPT_TPL_STRUCT((tree_type_t)
                                (simple_tree_t)(tree_type_t)
                                (tree_type_t,tree_data)
                                (类型名称的std ::矢量<的std :: shared_ptr的< tree_type_t>>,sub_tree))

I am trying to declare a self referential tree like structure that is templated on the type of data that the struct can hold. I am running into compilation errors, when trying to declare the boost fusion template adapt definition for this structure. Can anyone help ?

#include <iostream>
#include <string>
#include <memory>
#include <vector>

#include <boost/lexical_cast.hpp>
#include <boost/dynamic_bitset.hpp>

#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <boost/fusion/include/adapt_struct.hpp>

struct A
{
    int a_val;
    A() : a_val(0) {}
    A(int a) : a_val(a) {}

    friend std::ostream& operator<<(std::ostream &output, A &a_obj)
    {
        output << a_obj.a_val;
        return output;
    }
};

template <typename tree_type_t>
struct simple_tree_t
{
    simple_tree_t() {}
    simple_tree_t( tree_type_t t_obj):tree_data(t_obj) {}
    tree_type_t tree_data;

    std::vector < std::shared_ptr < tree_type_t > > sub_tree;

    typedef typename std::vector < std::shared_ptr < tree_type_t > >::iterator sub_tree_iterator;

    sub_tree_iterator sub_tree_begin() { return sub_tree.begin(); }
    sub_tree_iterator sub_tree_end() { return sub_tree.end(); }

    friend std::ostream& operator<<(std::ostream &output, simple_tree_t &tree)
    {
        output << tree.tree_data;
        std::for_each ( tree.sub_tree_begin(), 
                        tree.sub_tree_end(), 
                        ([&](const std::shared_ptr < A > f){
                            output << *f;
                            }) );
        return output;
    }
};

BOOST_FUSION_ADAPT_STRUCT ( A,
                                (int , a_val) )

BOOST_FUSION_ADAPT_TPL_STRUCT ( (tree_type_t)
                                (simple_tree_t) (tree_type_t)
                                (tree_type_t, tree_data)
                                (typename std::vector < std::shared_ptr < tree_type_t > > , sub_tree) )

int main(void)
{
    simple_tree_t<A> t_i, t_o;

    t_i.tree_data = A(10);
    t_i.sub_tree.push_back(std::make_shared<A>(A(20)));
    t_i.sub_tree.push_back(std::make_shared<A>(A(30)));

    std::cout << t_i << std::endl;

    return 0;
}

解决方案

@cv_and_he is spot on; Live On Coliru

BOOST_FUSION_ADAPT_TPL_STRUCT ( (tree_type_t),
                                (simple_tree_t) (tree_type_t),
                                (tree_type_t, tree_data)
                                (typename std::vector < std::shared_ptr < tree_type_t > > , sub_tree) )

这篇关于促进融合适应声明模板化的自我参照结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆