Boost.intrusive多容器

4
在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),将会产生错误。这是有意为之吗?为什么不允许使用第二个相同类型的容器?
1个回答

3
你很接近了。这是正确的格式:
#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);
}

啊,我明白了。应该是指针。所以,我们不能声明像DefaultList list1,list2或List1 a,b,c这样的东西,对吧?谢谢你的成员钩子。现在我知道我可以在基类中声明多个容器而不需要继承,并创建标签。似乎更好用。 - Amumu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接