2

我需要创建一个具有 avector<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内部的技术。

4

1 回答 1

2

更好的选择是使用boost::container::vector,因为它允许直接访问存储在向量中的类型。

它提供的额外间接层boost::recursive_wrapper允许 a 的声明std::vector<self>使操作向量的代码更加麻烦,因为有必要get访问所持有的实际类型。

IE

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()
}
于 2012-11-16T11:08:08.693 回答