函数参数Boost库bind函数的嵌套调用

时间:2022-09-08 11:33:44

查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!

    

问题提出:

    我写了一个函数,它要需应用一个生成整数随机数的随机数发生器作为参数。然后写了一个函数来根据参数生成不同分布的随机数发生器,供前一个函数应用。我用调了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有冲突,而且很多功能叠重,用一个就好了。

文章结束给大家分享下程序员的一些笑话语录: 一条狗在街上闲逛,看见橱窗里一张告示:「招聘程序员。会编程,有团队精神,至少精通两种语言。均等机会。」
  那条狗就进去申请,但是被拒绝了。
  「我不能雇一条狗在公司里做事。」经理说。
  狗不服气,指着告示上「均等机会」几字*。
  经理没法,叹了口气,不屑地问道:「你会编程吗?」
  那条狗默默地走到电脑前,编了个程序,运作准确。
  「你有团队精神吗?」经理问。
  那条狗掉头看了看门外,一大群野狗在外面虎视耽耽。
  「我真的不能雇狗做这份工作。」经理气急败坏地说。
  「就算会编程、有团队精神,但是我需要的雇员至少要能精通两种语言。」
  那条狗抬头看着经理说:「喵-噢。」