Estoy tratando de escribir una función de plantilla que acepte un std::function
que depende de los argumentos de la plantilla. Lamentablemente, el compilador no es capaz de deducir correctamente los argumentos al std::function
. Aquí algunos simples código de ejemplo:C++ 11 Función de plantilla que toma una función std :: que depende de los parámetros de la plantilla
#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;
}
Si llamo al molde con el siguiente:
CallFunc(id, param, DoSomething);
consigo los siguientes errores:
function-tpl.cpp:25: error: no matching function for call to
CallFunc(unsigned int&, unsigned int&, void (&)(unsigned int, unsigned int))
Si creo explícitamente un std :: función del tipo correcto (o emitirlo) el problema desaparece:
std::function< void (unsigned, unsigned) > func(DoSomething);
CallFunc(id, param, func);
¿Cómo codificaría esto para que no se necesite el temporal explícito?
¿Olvidaste eliminar los caracteres de comentario "//" antes de la línea ofensiva? Tengo GCC4.6.1 y ese GCC rechaza dicha línea. –
@litb * D'OH!* Bien descrito. –