3


1

shared_ptrのコレクションでboost.assignを使用する

次のコードを見てください。

class Foo {
public:
    Foo( int Value );

    // other stuff
};

std::list< boost::shared_ptr< Foo > > ListOfFoo = list_of( 1 )( 2 )( 3 )( 4 )( 5 );

これはそのままでは機能しません。 この作業を行う最も簡単な方法は何ですか、またはそれと同じくらい単純に値を `ListOfFoo`に割り当てる方法はありますか?

4 Answer


3


http://www.boost.org/doc/libs/1_42_0/libs/assign/doc/index.html#ptr_list_of [`boost

assign :: ptr_list_of`]を使用すると、http://www.boostを作成できます。 org / doc / libs / 1_42_0 / libs / ptr_container / doc / tutorial.html [ブーストポインタコンテナ]は非常にシンプルな構文です。 `shared_ptr`のコンテナを作成できるように、プライベート継承を介して拡張できます。

template< class T >
struct shared_ptr_list : boost::assign_detail::generic_ptr_list
{
    typedef boost::assign_detail::generic_ptr_list Base;

    template< class Seq >
    operator Seq() const
    {
        Seq result;
        for(typename Base::impl_type::iterator it = Base::values_.begin(), e = Base::values_.end(); it != e; ++it)
            result.push_back(typename Seq::value_type(&*it));
        Base::values_.release().release();
        return result;
    }

    template< class U >
    shared_ptr_list& operator()( const U& u )
    {
        return (shared_ptr_list&)boost::assign_detail
               ::generic_ptr_list::operator()(u);
    }
};

template< class T, class U >
shared_ptr_list shared_ptr_list_of( const U& t )
{
    return shared_ptr_list()(t);
}

見た目は少しbutいですが、使用すると本当に便利です。

int main()
{
    using boost::shared_ptr;
    std::deque > deq = shared_ptr_list_of(1)(2)(3);
}


2


別の方法は、引数の配列で `std

transform`を使用することです:

const unsigned DataSize = 5;
int data[DataSize] = {1, 2, 3, 4, 5};
std::list > ListOfFoo;
std::transform(data, data + DataSize, std::back_inserter(ListOfFoo), &boost::make_shared);

リストをさらに大きくする場合、おそらく見栄えがよくなります。


1


std::list > ListOfFoo = boost::assign::list_of(boost::make_shared(1))(boost::make_shared(2));

`Foo *`から `shared_ptr`への暗黙的な変換はありません。

shared_ptr ptr = new Foo(1); // you can't do this
shared_ptr ptr(new Foo(1)); // this is ok
shared_ptr ptr = make_shared(1); // this is also ok

あなたが望むことは不可能です、あなたは明示的に共有ポインタを作成し、それらを `list_of`に渡す必要があります。


1


boost

list_ofには `boost :: shared_ptr`タイプのオブジェクトが必要です。 したがって、次のようにできます。

typedef boost::shared_ptr FooPtr;

std::list > fooList = list_of
    (FooPtr(new Foo(1))
    (FooPtr(new Foo(2))
    (FooPtr(new Foo(3));