读书人

问一个小疑点关于boost:bind和fun

发布时间: 2012-03-05 11:54:02 作者: rapoo

问一个小问题,关于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);

读书人网 >C++

热点推荐