valores sobrecarga retornan referencia que por paso parametros funciones estructuras ejercicios ejemplos como arreglos c++ templates

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);