用于在堆上生成对象的函数式编程技术

functional programming techniques for generating objects on the heap

本文关键字:函数 编程 技术 对象 用于      更新时间:2023-10-16

下面是在堆上生成N个A类对象的代码示例:

#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"answers"generate_n"算法来完成这项工作。我想知道如何简化这项任务。Boost:lambda、Boost::phoenix是可能的候选对象(如果是的话?),如何实现呢?或者可能还有其他选择?

在第一种情况下,简单将不会使问题复杂化:

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