2011-01-03 13 views
7

Na przykład, co jest złego w zadeklarowaniu podwajacza klas w funkcji głównej, jeśli predykat zostanie użyty tylko raz?Dlaczego korzystanie z lokalnego funktora jest złe?

#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; 
} 

Odpowiedz

14

Problem z tej konfiguracji jest to, że przynajmniej w C++ 03, nie można korzystać z lokalnego funktor jako szablonu argumentu, ponieważ nie mają zewnętrznych powiązań. Oznacza to, że z technicznego punktu widzenia powyższy kod nie jest legalny. Jednak naprawiają to w C++ 0x, ponieważ jest to dość głupie ograniczenie, a ponieważ VS2010 ma podstawowe wsparcie C++ 0x powyższy kod jest całkowicie w porządku.

Krótko mówiąc, odpowiedź na twoje pytanie jest taka, że ​​nie ma w tym nic złego, jeśli używasz kompilatorów zgodnych z C++ 0x, ale w przeciwnym razie powinieneś powstrzymać się od tego, aby zmaksymalizować kompatybilność między kompilatorami.

+1

vs2008 umożliwia to również – stijn

+2

dobrze, jeśli korzystasz z VS2010, możesz przejść bezpośrednio do funkcji lambda. for_each (myList.begin(), myList.end(), [] (int val) {return val + val;}); –

+0

vs2005 również to umożliwia, i na stronie internetowej, GCC daje dość tajemniczy komunikat o błędzie, gdy typem funktora jest szablon:/(wpadłem na to, próbując skompilować kod, który kompilował się zupełnie dobrze z VS) – smerlin

5
  • Jest nielegalne przed C++ 0x
  • w C++ 0x, istnieje lepsze rozwiązanie (lambda/zamknięcia)

Tak więc w obu przypadkach trzeba zastosować inne rozwiązanie.

+0

ładne podsumowania. –

Powiązane problemy