在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),则会产生错误。这是有意的吗?为什么我们不允许使用相同类型的第二个容器?</ p>
答案 0 :(得分: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);
}