有一些代码可以在堆上生成类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”算法来完成这项工作。我对简化这项任务感到不安。提升:lambda,boost :: phoenix是可能的候选者(如果是的话?),以及怎么做?或许还有其他选择?
答案 0 :(得分: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 ++中,试图强制解决问题的功能性方法会使事情变得比他们需要的更复杂。
在编译器中使用lambda支持,你可以这样做:
std::vector< shared_ptr<A> > coll;
std::generate_n( back_inserter(coll), 3, [](){
return std::make_shared<A>(std::rand()%10 + 1); });