sobrecarga - paso de parametros en c++
Pasa una función como un parámetro de plantilla explícito (2)
En el ejemplo de código a continuación, la llamada a foo
funciona, mientras que la llamada a la bar
falla.
Si comento la llamada a la bar
, el código se compila, lo que me dice que la definición de bar
sí está bien. Entonces, ¿cómo se llamaría bar
correctamente?
#include <iostream>
using namespace std;
int multiply(int x, int y)
{
return x * y;
}
template <class F>
void foo(int x, int y, F f)
{
cout << f(x, y) << endl;
}
template <class F>
void bar(int x, int y)
{
cout << F(x, y) << endl;
}
int main()
{
foo(3, 4, multiply); // works
bar<multiply>(3, 4); // fails
return 0;
}
El problema aquí es, multiply
no es un tipo ; es un valor, pero la bar
plantilla de función espera que el argumento de la plantilla sea un tipo . De ahí el error.
Si define la plantilla de función como:
template <int (*F)(int,int)> //now it''ll accept multiply (i.e value)
void bar(int x, int y)
{
cout << F(x, y) << endl;
}
entonces funcionará. Ver demostración en línea: http://ideone.com/qJrAe
Puedes simplificar la sintaxis usando typedef
como:
typedef int (*Fun)(int,int);
template <Fun F> //now it''ll accept multiply (i.e value)
void bar(int x, int y)
{
cout << F(x, y) << endl;
}
multiply
no es un tipo, es una función. En ese contexto, decae a un puntero de función. Sin embargo, la bar
está templada para un tipo que, de nuevo, la multiply
no lo es.
Nawaz ya respondió a la pregunta al revés (cómo cambiar la definición de la bar
que se usará con las funciones), pero para responder a su pregunta explícita de cómo llamar a la bar
como la tiene, necesita un tipo adecuado, como este:
struct Type {
const int result;
Type(int x, int y): result(x * y) {}
operator int() const { return result; }
};
// usage
bar<Type>(x, y);
// (edit) a suitable type doesn''t necessarily mean a new type; this works as well
// if you aren''t trying to solve any specific problem
bar<std::string>(64, 64);