2011-01-03 14 views
7

Por ejemplo, ¿qué hay de malo en declarar el duplicador de clase dentro de la función principal, si el predicado solo se usará una vez?¿Por qué es malo tener un functor local?

#include <list> 
#include <algorithm> 
#define SIZE 10 
int main() 
{ 
    std::list<int> myList; 
    for(int i=0; i<SIZE ;++i) 
    { 
     myList.push_back(i); 
    } 

    class doubler 
    { 
    public: 
     doubler(){} 
     int operator()(int a) 
     { 
      return a + a; 
     } 

    } pred; 

    std::for_each(myList.begin(), myList.end(), pred); 
    return 0; 
} 

Respuesta

14

El problema con esta disposición es que, al menos en C++ 03, no se puede utilizar un funtor local como un parámetro de plantilla, ya que no tiene vinculación externa. Esto significa que técnicamente hablando, el código anterior no es legal. Sin embargo, están arreglando esto en C++ 0x ya que es una restricción bastante tonta, y como VS2010 tiene soporte rudimentario de C++ 0x, el código anterior está totalmente bien.

En resumen, la respuesta a su pregunta es que no hay nada de malo si utiliza compiladores que cumplen con C++ 0, pero de lo contrario probablemente debería abstenerse de hacerlo para maximizar la compatibilidad entre compiladores.

+1

VS2008 permite esto también – stijn

+2

bien, si usted está usando VS2010 se puede ir a una función lambda directamente. for_each (myList.begin(), myList.end(), [] (int val) {return val + val;}); –

+0

VS2005 permite esto también, y en una nota al margen, GCC da un msg de error bastante críptico, cuando el tipo de funtor es una plantilla:/(me encontré con esto cuando se trata de elaborar un código el cual compila totalmente bien con VS) – smerlin

5
  • Es ilegal antes de C++ 0x
  • En C++ 0x, hay una solución mejor (lambdas/cierres)

Así que en cualquier caso se debe utilizar una solución diferente.

+0

buen resumen. –

Cuestiones relacionadas