2011-07-30 8 views
7

A veces, necesito algún functor-helper para manipular la lista. Intento mantener el alcance lo más local posible.cómo definir un functor dentro de una función

#include <iostream> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    struct Square 
    { 
     int operator()(int x) 
     { 
      return x*x; 
     } 
    }; 

    int a[5] = {0, 1, 2, 3, 4}; 
    int b[5]; 

    transform(a, a+5, b, Square()); 

    for(int i=0; i<5; i++) 
     cout<<a[i]<<" "<<b[i]<<endl; 
} 

hello.cpp: In function ‘int main()’: 
hello.cpp:18:34: error: no matching function for call to ‘transform(int [5], int*, int [5], main()::Square)’ 

Si muevo Square de main(), está bien.

+0

[Ver esta pregunta] (http://stackoverflow.com/questions/6880077/why-does-this-stdsort-predicate-fail-when-the-class-is-inside-main). – hammar

+0

Hmm ... Copié el código de la pregunta y lo probé en VS2010, y funciona bien ...: - \. – TCS

Respuesta

6

No puede hacerlo. Sin embargo, en algunos casos, puede usar las bibliotecas boost::bind o boost::lambda para crear funtores sin declarar una estructura externa. Además, si usted tiene un compilador reciente (como gcc versión 4.5) se puede activar el nuevo C++ 0x características que le permiten utilizar las expresiones lambda, lo que permite por ejemplo de sintaxis:

transform(a, a+5, b, [](int x) -> int { return x*x; });

+0

+1 para la nota "0x puede hacerlo". – bitmask

6

En el estándar actual (C++ 98/03) las clases locales (funtores locales) no se pueden usar como clases como un parámetro de plantilla.

-1

Creo que la mejor respuesta a esta pregunta es "Usar un lenguaje de programación functional".

+2

Las etiquetas son parte de la pregunta, así que, aunque esa es una respuesta a una pregunta similar a esta, no creo que sea una respuesta a esta. –

0

Como se señala en varias respuestas aquí, C++ pre-0x no puede usar tipos locales como argumentos de plantilla. Lo que suelo hacer para eludir este problema (además de esperar que los proyectos en los que trabajo vaya a C++ 0x pronto) es poner la clase local respectiva como una clase anidada privada en la clase de la función miembro que necesita este funtor. Alternativamente, a veces pongo el funtor en el archivo respectivo .cpp, imaginando que es más limpio (y algo más rápido de compilar).

Cuestiones relacionadas