用于在堆上生成对象的函数式编程技术
functional programming techniques for generating objects on the heap
下面是在堆上生成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); });
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- C++使用模板元编程生成函数
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 如何使用模板元编程在自由函数C++链接两个不相关的类
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 以编程方式在 C++ 中创建函数
- 创建析构函数是好的编程实践吗?
- 当您希望在Arduino Uno编程中同时执行不同函数时,使用什么代码/语句
- 使用C++元编程提取 C 函数的参数("Practical C++ Metaprogramming" 中的示例)
- 函数模板编程而不是继承
- 可视化 在C++编程中编写一个函数星号
- C++函数式编程.实施 f(a)(b)(c)
- C :对输入验证函数进行编程的性能影响可以对其进行编程,而每次都可以将其编程
- 是否有任何函数可用于在 c++ 编程中传输流程,以替代 while 或 do while 循环
- 在使用英特尔内部函数对 SIMD 代码进行编程时,如何强制使用 vmovapd 而不是 vmovupd?
- CPP 元编程:包含元组函数
- 模板元编程:检查稍后定义的函数是否存在
- 是c++模板元编程的一种函数编程形式
- 为什么Erlang和其他函数编程语言不是原生的c/c++
- 形成递归函数C++编程