【问题标题】:Boost.intrusive multiple containersBoost.intrusive 多个容器
【发布时间】:2011-05-30 08:43:47
【问题描述】:

在 boost.intrusive 文档中,它提到了使用多个容器来存储一个对象。但是,没有实际的例子,所以我自己做了。这是正确的做法吗?

#include <boost/intrusive/list.hpp>
struct tag1;
class A:public list_member_hook<>, public list_member_hook<tag<tag1> >
{
}

typedef list_base_hook<tag<tag1> > TagHook;
typedef list<A> DefaultList;
typedef list<A, base_hook<TagHook> > TagList;

int main()
{
     DefaultList dList;
     TagList tList;
     A *a = new A();
     dList.push_back(a);
     tList.push_back(a);
}

如果我添加另一个相同类型的容器(例如添加另一个 DefaultList),则会产生错误。这是故意的吗?为什么我们不允许使用第二个相同类型的容器?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    你已经接近了。它应该是这样的:

    #include <boost/intrusive/list.hpp>
    struct tag1;
    class A:public list_base_hook<>, public list_base_hook<tag<tag1> >
    {
    }
    
    typedef list_base_hook<tag<tag1> > TagHook;
    typedef list<A> DefaultList;
    typedef list<A, base_hook<TagHook> > TagList;
    
    int main()
    {
         DefaultList dList;
         TagList tList;
         A *a = new A();
         dList.push_back(*a);
         tList.push_back(*a);
    }
    

    list_base_hook 在你想继承钩子时使用。 list_member_hook 用于当您希望钩子成为成员时。此外,push_back 接受引用,而不是指针。

    这是一个使用成员挂钩的示例:

    #include <boost/intrusive/list.hpp>
    class A
    {
    public:
        list_member_hook<> m_hook1, m_hook2;
    }
    
    typedef list<A, member_hook<A, list_member_hook<>, &A::m_hook1> > List1;
    typedef list<A, member_hook<A, list_member_hook<>, &A::m_hook2> > List2;
    
    int main()
    {
         List1 list1;
         List2 list2;
         A *a = new A();
         list1.push_back(*a);
         list2.push_back(*a);
    }
    

    【讨论】:

    • 啊,我明白了。应该是指针。所以,我们不能声明像 Def​​aultList list1,list2 或 List1 a,b,c 这样的东西,对吧? Ty 为会员挂钩。现在我知道我可以在没有继承的情况下在基类中声明多个容器并创建标签。似乎更好用。
    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多