1

ヒープ上にクラスAのN個のオブジェクトを生成するコードの例があります。

#include <vector>
#include <iostream>
#include <algorithm>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

using boost::make_shared;
using boost::shared_ptr;

class A
{
    int val_;
public:
    explicit A(int i) : val_(i) {}
    int foo() const { return val_;}
};

template<typename T>
struct Generator
{
    shared_ptr<T> operator()()
    {
        return make_shared<T>(std::rand() % 10 + 1);
    }
};


int main()
{
    std::vector< shared_ptr<A> > coll;
    std::generate_n( back_inserter(coll), 3, Generator<A>());

    std::vector<shared_ptr<A> >::const_iterator cit;
    for (cit = coll.begin(); cit != coll.begin(); ++cit)
        std::cout << (*cit)->foo() << std::endl;            

    return 0;
}

コードは、ファンクター「Generator」および「generate_n」アルゴリズムを使用してジョブを実行します。私はこのタスクの単純化について悩んでいます。boost:lambda、boost :: phoenixは可能な候補です(もしそうなら?)、そしてそれをどのように行うのですか?または多分他の選択肢がありますか?

4

1 に答える 1

2

簡単なのは、最初のケースで問題を複雑にしないことです:

std::vector< std::shared_ptr<A> > ints;
for ( int i = 0; i < 3; ++i ) 
   ints.push_back( std::make_shared<A>( std::rand()%10 + 1 ) );

それぞれの異なるパラダイムには長所と短所があり、この場合、C++ では、問題に対して機能的なアプローチを強制しようとすると、必要以上に複雑になります。

コンパイラでラムダをサポートすると、次のことができます。

std::vector< shared_ptr<A> > coll;
std::generate_n( back_inserter(coll), 3, [](){ 
    return std::make_shared<A>(std::rand()%10 + 1); });
于 2011-10-12T09:16:45.173 に答える