假设我有一个以空函子作为参数的函数:
void enqueue( boost::function<void()> & functor );
我有另一个函数,它接受一个 int 并在内部做一些事情:
void foo( int a);
我想将这些嵌套但不组合在一起,以便我得到一个带有签名的函子:
boost::function<void(int)> functor
当使用一个值调用时 - 比如 4 - 执行以下操作:
enqueue( boost::bind(&foo, 4) )
我的第一次尝试如下:
boost::function<void(int)> functor = boost::bind(&enqueue, boost::bind(&foo,_1))
这失败了,因为 bind 在给定嵌套绑定时执行组合。首先调用 foo ,然后将值 void “返回”到 enqueue,但失败了。
我的第二次尝试如下:
boost::function<void(int)> functor = boost::bind(&enqueue, boost::protect( boost::bind(&foo, _1) ) )
这失败了,因为 enqueue 接受一个空函数,而不是一元函子。
我所寻求的可以完成吗?
其他信息:
- 这与 6 年前未回答的 boost 论坛问题基本相同:http: //lists.boost.org/boost-users/2004/07/7125.php
- 一些阅读表明,将 boost::lambda::bind 与 boost::lambda::unlambda 和 boost::lambda::protect 一起使用可能会满足我的要求。不幸的是 boost::lambda 的允许占位符 (3) 数量少得令人无法接受,而且编译时开销也很高。