Я пытаюсь написать шаблонную функцию, которая принимает 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 );
Как бы я закодировал это, чтобы явный временный указатель не был необходим?