我正在尝试编写一个简单的函数来转换 std::function<> 对象,同时绑定最后一个参数。这就是我所拥有的:
template<typename R, typename Bind, typename ...Args> std::function<R (Args...)> bindParameter (std::function<R (Args..., Bind)> f, Bind b)
{
return [f, b] (Args... args) -> R { return f (args..., b); };
}
这就是我想使用它的方式:
int blub (int a, int b)
{
return a * b;
}
// ...
int main ()
{
std::function<int (int, int)> f1 (blub);
// doesn't work
std::function<int (int)> f2 = bindParameter (f1, 21);
// works
std::function<int (int)> f3 = bindParameter<int, int, int> (f1, 21);
return f2 (2);
}
...因此在此示例中,主函数应返回 42。问题是,gcc (4.6) 似乎无法正确推断模板参数的类型,第一个版本产生以下错误:
test.cpp:35:58: error: no matching function for call to 'bindParameter(std::function<int(int, int)>&, int)'
test.cpp:35:58: note: candidate is:
test.cpp:21:82: note: template<class R, class Bind, class ... Args> std::function<R(Args ...)> bindParameter(std::function<R(Args ..., Bind)>, Bind)
但在我看来,参数是显而易见的。还是这种类型的推断没有被标准覆盖或者还没有在 gcc 中实现?