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

Oversense 2007-06-07 11:12:16
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可以实现不?该怎么写这个语句呢?
...全文
402 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2007-06-12
  • 打赏
  • 举报
回复
呃,又长时间研究,理论上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);
Oversense 2007-06-09
  • 打赏
  • 举报
回复
是的,好像是不太好弄

实际代码里,f0 是想做为一个回调函数传给其他类,

主要是这种函数太多了,要写中间函数,要写好多,所以我想怎么简化下

其实lambda看起来不顺眼,说不定是写了太多c++的缘故,

如果写几年scheme,可能就会觉得lambda亲切了


taodm 2007-06-08
  • 打赏
  • 举报
回复
研究了一下,真是抱歉,bind/lambda/phoenix库都无法实现你的要求。
即使有办法可以完成,用另外一个小函数明确表示你的意图在可读性方面要好得多。
建议你不要在这方面多浪费时间。要合理抵制lambda的诱惑。
Oversense 2007-06-08
  • 打赏
  • 举报
回复
fi_t f0 = bind( bar, fv_t(bind(foo, _1)));
的写法是不对的,通不过编译。

bind(foo, _1) 是fi_t
fi_t 怎么能赋值给fv_t

FingerStyle 2007-06-08
  • 打赏
  • 举报
回复
jixingzhong(瞌睡虫·星辰) ( ) 信誉:100 Blog 加为好友 2007-06-08 08:54:53 得分: 0
taodm ...
================
虫子也呼唤陶大妈啊.. ~!~..


  • 打赏
  • 举报
回复
函数类型 ,好麻烦啊
deng2000 2007-06-08
  • 打赏
  • 举报
回复
此问题真是很难.我所能想到的最接近的lambda解法是引入一个临时变量x:

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

Anyway, 正如taodm所说,用另外一个小函数在可读性方面要好得多.
jixingzhong 2007-06-08
  • 打赏
  • 举报
回复
taodm ...
taodm 2007-06-08
  • 打赏
  • 举报
回复
fi_t f0 = bind( bar, fv_t(bind(foo, _1)));
expter 2007-06-07
  • 打赏
  • 举报
回复
没看过boost代码..

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧