2

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; 
};

それぞれの技術に利点はありますか?2 番目のオプションは構文が少なく、内部的boost::containerには と同様の手法を使用していると思います。boost::recursive_wrapper

4

1 に答える 1

2

boost::container::vectorベクトルに格納されている型に直接アクセスできるため、を使用することをお勧めします。

によって提供される追加の間接レイヤーによりboost::recursive_wrapper、 a の宣言が可能になり、ベクトルを操作するコードがより面倒になります。これは、保持されている実際の型にアクセスする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()
}
于 2012-11-16T11:08:08.693 に答える