有趣的问题...
您基本上想要的是“绑定调用绑定”。以与绑定调用相同的方式foo(x, y)
被写成bind(&foo, x, y)
,绑定一个调用bind(&foo, x)
应该像bind(&bind, &foo, x)
。然而,获取重载函数的地址很快就会变得丑陋,并且,boost::bind
重载超出了我的数,它变得非常难看:
// One single line, broken for "readability"
boost::function<void(int)> f = boost::bind(
&enqueue,
boost::bind(
static_cast<
boost::_bi::bind_t<
void, void(*)(int), boost::_bi::list_av_1<int>::type
>
(*)(void(*)(int), int)
>(&boost::bind),
&foo,
_1
)
);
您可能会同意,虽然“有趣”,但上述内容不会赢得可读性竞赛。将正确绑定重载的获取与其余部分分开使事情更易于管理:
boost::_bi::bind_t<void, void(*)(int), boost::_bi::list_av_1<int>::type>
(*bind_foo)(void(*)(int), int) = &boost::bind;
boost::function<void(int)> q = boost::bind(&enqueue, boost::bind(bind_foo, &foo, _1));
但我还是犹豫是否推荐它;)
Edit:
回答OP关于如何/如果C++0x将有助于清理语法的评论:它确实:
auto f = [](int i){enqueue([=](){foo(i);});};