Boost.侵入式多个容器

Boost.intrusive multiple containers

本文关键字:Boost      更新时间:2023-10-16

在boost.intropt文档中,它提到使用多个容器存储在一个对象中。然而,没有实际的例子,所以我自己做了。这样做对吗?

#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),它将产生错误。这是有意的吗?为什么我们不允许使用第二个相同类型的容器?

你很接近。它应该是这样的:

#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_hooklist_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);
}