【发布时间】:2011-09-30 09:57:13
【问题描述】:
我正在尝试编写一个接受 std::function 的模板函数,这取决于模板参数。不幸的是,编译器无法正确推断std::function 的参数。这里有一些简单的示例代码:
#include <iostream>
#include <functional>
using namespace std;
void DoSomething( unsigned ident, unsigned param )
{
cout << "DoSomething called, ident = " << ident << ", param = " << param << "\n";
}
template < typename Ident, typename Param >
void CallFunc( Ident ident, Param param, std::function< void ( Ident, Param ) > op )
{
op( ident, param );
}
int main()
{
unsigned id(1);
unsigned param(1);
// The following fails to compile
// CallFunc( id, param, DoSomething );
// this is ok
std::function< void ( unsigned, unsigned ) > func( DoSomething );
CallFunc( id, param, func );
return 0;
}
如果我使用以下内容调用模板:
CallFunc( id, param, DoSomething );
我收到以下错误:
function-tpl.cpp:25: 错误:没有匹配的函数调用
CallFunc(unsigned int&, unsigned int&, void (&)(unsigned int, unsigned int))
如果我明确地创建了一个正确类型的 std::function(或强制转换它),问题就会消失:
std::function< void ( unsigned, unsigned ) > func( DoSomething );
CallFunc( id, param, func );
我将如何编码这样就不需要显式临时?
【问题讨论】: