gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:32:22 27 4
gpt4 key购买 nike

有在堆上生成 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”和“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); });

关于c++ - 用于在堆上生成对象的函数式编程技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7737350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com