Используйте boost :: container или boost :: recursive_wrapper для создания контейнеров неполных типов

Мне нужно создать структуру, которая имеет vector<self> как переменная-член. Boost предлагает 2 механизма, которые достигают этого:

1 — использование boost::recursive_wrapper т.е .:

struct filter
{
uint32_t id;
std::vector< boost::recursive_wrapper< filter > > childFilters;
};

2 — использование boost::container т.е .:

struct filter
{
uint32_t id;
boost::container::vector< filter > childFilters;
};

Есть ли преимущество с каждой техникой? Второй boost::container Опция включает меньше синтаксиса, и я думаю, что он использует технику, аналогичную boost::recursive_wrapper внутренне.

2

Решение

Лучший выбор — использовать boost::container::vector, потому что это позволяет прямой доступ к типу, хранящемуся в векторе.

Дополнительный слой косвенности обеспечивается boost::recursive_wrapper что позволяет объявить std::vector<self> делает код, управляющий вектором, более громоздким, потому что это необходимо get чтобы получить доступ к фактическому типу удержания.

то есть

struct filter
{
uint32_t id;
std::vector< boost::recursive_wrapper< filter > > childFilters;
};

filter myFilter;

// fill myFilter .....

BOOST_FOREACH( boost::recursive_wrapper< filter > f, myFilter.childFilters )
{
std::cout << f.get().id << "\n";
}

С boost::container::vector пример становится:

struct filter
{
uint32_t id;
boost::container::vector< filter > childFilters;
};

filter myFilter;

// fill myFilter .....

BOOST_FOREACH( boost::recursive_wrapper< filter > f, myFilter.childFilters )
{
std::cout << f.id << "\n";    // no call to get()
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]