首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问一个小疑点,关于boost:bind,和function,lambda也可能有点关系

2012-03-05 
问一个小问题,关于boost::bind,和function,lambda也可能有点关系typedeffunction void(void)fv_ttypede

问一个小问题,关于boost::bind,和function,lambda也可能有点关系
typedef   function <void   (void)>   fv_t;
typedef   function <void   (int)>   fi_t;

void   bar(fv_t   f){
}

void   foo(int   i){
}

void   bridge(int   i){
bar(   bind(foo,   i)   );
}

int   main()
{
fi_t   f0   =   bind(   bridge,   _1   );
}

上面的程序没有问题,但是我想去掉bridge函数
直接给f0赋值,请问这个bind语句该怎么写呢?

比如         (这么写不对)   fi_t   f0   =   bind(   bar,   bind(foo,   _1)   );

或者用boost::lambda可以实现不?该怎么写这个语句呢?

[解决办法]
没看过boost代码..
[解决办法]
taodm ...
[解决办法]
函数类型 ,好麻烦啊
[解决办法]
jixingzhong(瞌睡虫·星辰) ( ) 信誉:100 Blog 加为好友 2007-06-08 08:54:53 得分: 0
taodm ...
================
虫子也呼唤陶大妈啊.. ~!~..



[解决办法]
此问题真是很难.我所能想到的最接近的lambda解法是引入一个临时变量x:

int x;
fi_t f0 = bind(bar, (var(x)=_1, unlambda(bind(foo,var(x)))));

Anyway, 正如taodm所说,用另外一个小函数在可读性方面要好得多.

[解决办法]
呃,又长时间研究,理论上boost::phoenix升级到2.0后可以完成此功能。
代码是 fi_t f = bind(&bar, lambda(_a = arg1)[bind(&foo, _a)]);
但是,因为它的内部代码缺陷,这个编译不过,下面的情况就可以了。
typedef boost::function <void (int)> fi_t;

void bar(fi_t f){
int i = 12;
cout < < "In bar " < < endl;
f(i);
}

void foo(int i, int j){
cout < < "In foo " < < i < < j < < endl;
}

int main(void)
{
int x = 1;
fi_t f = bind(bar, lambda(_a = arg1)[bind(foo, _a, arg1)]);
f(x);

热点排行