查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!
问题提出:
我写了一个函数,它要需应用一个生成整数随机数的随机数发生器作为参数。然后写了一个函数来根据参数生成不同分布的随机数发生器,供前一个函数应用。我用调了boost库的一些基于特定概率分布的随机数生成函数,但是有很多函数的结果是double型的。
我的函数将随机数发生器定义为boost::function<int()>类型。很明显那些生成double的函数不能直接通过bind operator()的式方失掉,而要需类型转换。而这个应用bind/function的嵌套用调就较比麻烦了。
设假我有两个函数:
int trans(double); double gen();
我希望的结果是失掉一个函数象对:它应用gen生成原始数字,然后用trans函数把它转成形整返回;即失掉一个这样的函数:
int fun(){ return trans(gen()); }
我这里还是无参数的,所以欠好应用lambda表达式。
终最计划与要点:
设假应用面前的函数明声,那么这个函数象对应当这么生成:
boost::function<int()> fun=boost::bind(trans,boost::bind(gen));
其中要应用两次bind!
内层的那个看似没什么用,但是如果不适用它的话,boost不会为以我们要定绑的第一个参数是一个函数,而是为以我们要定绑一个体具的值,这个数字的值由这个gen函数生产。这时编译器会报“没法将double(void)类型转换为double类型”的错误。
样同的其他参数式形的(要需应用lambda库)、多层的函数嵌套定绑,都应当意注要把内层的函数通过bind酿成一个可传递的象对,而不能直接写函数名!
bind定绑的各个西东都是象对(括包基本数据类型),是不支持把参数直接定绑为函数的,要这边做必须先把函数酿成可以由自传递的象对!
另外不要为以你的参数已经是函数象对了就能够直接写了,还要再写bind(),体具因原还不清晰。
其他验经:
1,static_cast<T>()是运算符而不是函数!所以不能定绑。
2,boost/lambda/casts.hpp供给的ll_static_cast<T>虽然是函数,但是要需意注的是它是有两个模板参数的模板函数,在定绑的时候我们不能给出参数的现实类型(外侧的bind函数给ll_static_cast供给的是funnction<int()>的类型而不是int),因而也不能应用ll_static_cast,要自己写转换函数。
3,bind和lambda/bind有冲突,而且很多功能叠重,用一个就好了。
文章结束给大家分享下程序员的一些笑话语录: 一条狗在街上闲逛,看见橱窗里一张告示:「招聘程序员。会编程,有团队精神,至少精通两种语言。均等机会。」
那条狗就进去申请,但是被拒绝了。
「我不能雇一条狗在公司里做事。」经理说。
狗不服气,指着告示上「均等机会」几字*。
经理没法,叹了口气,不屑地问道:「你会编程吗?」
那条狗默默地走到电脑前,编了个程序,运作准确。
「你有团队精神吗?」经理问。
那条狗掉头看了看门外,一大群野狗在外面虎视耽耽。
「我真的不能雇狗做这份工作。」经理气急败坏地说。
「就算会编程、有团队精神,但是我需要的雇员至少要能精通两种语言。」
那条狗抬头看着经理说:「喵-噢。」