Мне нужно создать структуру, которая имеет 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
внутренне.
Лучший выбор — использовать 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()
}
Других решений пока нет …