Boost.intrusive несколько контейнеров

В документе 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 ответ

Решение

Ты рядом. Вот как это должно выглядеть:

#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);
}
Другие вопросы по тегам