45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 编程代码 > 阅读资讯:boost lambda知识介绍

boost lambda知识介绍

2016-09-05 04:13:50 来源:www.45fan.com 【

boost lambda知识介绍



1, 简介
有的时候我们实在是很烦写一个function object了. 为了一个简单的目的,
不得不跳到很远的某一个hpp文件里面去在声明一个function object, ft.
lambda能帮你去除烦恼.

btw: lambda并不仅仅为了方便你"写"程序. 它能在代码优化上发挥一定的作用.

2, 使用
套用一下,
for_each(x, x+N, std::cout <<_1 * 1.8);
很简单是吗?

3, 实现

这个东西寒假时候学习过, 所以提上来先写吧.
如果还是从源代码来看他的实现, 我想我又要累个半死了.
所以这次决定偷懒, 我直接从一个简单的实现来说明这
个东西到底是怎么工作的. 这个实现是从blitz作者主页上
的例子剪裁的, 并非我原创, 特此声明!!

首先, 定义一个包装用的类
template<class A>
struct DExpr {
A a_;

DExpr(const A& x) : a_(x){ }

double operator()(double x) const
{ return a_(x); }
};
显然这个类什么也不会作, 摆在这里的作用类似于一个boost::any
然后
struct DExprIdentity {
DExprIdentity() { }

double operator()(double x) const
{ return x; }
}; //Identity, 就当是我们数学概念里面的变量了 ;)
struct DExprLiteral {
double value_;

DExprLiteral(double value)
{ value_ = value; }

double operator()(double ) const
{ return value_; }
}; //Literal, 就当是我们数学概念里面的常量吧
struct DApAdd {
DApAdd() { }

static inline double apply(double a, double b)
{ return a+b; }
}; //这个类里面定义了一个方法apply, 具体实现了加法
template<class A, class B, class Op>
struct DBinExprOp {
A a_;
B b_;

DBinExprOp(const A& a, const B& b)
: a_(a), b_(b)
{ }

double operator()(double x) const
{ return Op::apply(a_(x), b_(x)); }
}; //注意这里的用法,^^^^^^^^^^^^^^
template<class A>
DExpr<DBinExprOp<DExprLiteral, DExpr<A>, DApAdd> >
operator+(double x, const DExpr<A>& a)
{
typedef DBinExprOp<DExprLiteral, DExpr<A>, DApAdd> ExprT;
return DExpr<ExprT>(ExprT(DExprLiteral(x),a));
} //重载了加法
就是这些了, 假设我们定义了一个DExpr<DExprIdentity> a;
那么a+1.2就是一个函数对象了(因为他确实有一个operator()函数).
当我们对a+1.2调用(a+1.2)(3.4)的时候, 其实是调用了
DApAdd::apply(DExprIdentiry(a)(3.4), DExprLiteral(1.2)(3.4));
// 注意a构造成一个identity, 所以对它调用(3.4)返回的就是3.4
// 注意1.2构造成一个Literal, 所以对它调用(3.4)返回的还是1.2
// 综合起来(a+1.2)(3.4)返回的就是 4.6.
 

本文地址:http://www.45fan.com/bcdm/72448.html
Tags: 简介 Lambda Boost
编辑:路饭网
推广内容
推荐阅读
热门推荐
推荐文章
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部