2011-01-03 20 views
7

Zum Beispiel, was ist falsch mit der Klasse Verdoppler innerhalb der Hauptfunktion zu erklären, wenn das Prädikat nur einmal verwendet wird?Warum ist es schlecht, einen lokalen Funktor zu haben?

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

Antwort

14

Das Problem bei dieser Einrichtung besteht darin, dass, zumindest in C++ 03, Sie nicht einen lokalen Funktors als Template-Argument verwenden können, weil es nicht externe Bindung hat. Dies bedeutet, dass der oben genannte Code technisch gesehen nicht legal ist. Allerdings beheben sie dies in C++ 0x, da es eine ziemlich dumme Einschränkung ist, und da VS2010 rudimentäre C++ 0x-Unterstützung hat, ist der obige Code völlig in Ordnung.

Kurz gesagt, die Antwort auf Ihre Frage ist, dass nichts daran falsch ist, wenn Sie C++ 0x-kompatible Compiler verwenden, aber ansonsten sollten Sie davon Abstand nehmen, um die Cross-Compiler-Kompatibilität zu maximieren.

+1

vs2008 ermöglicht dies auch – stijn

+2

gut, wenn Sie mit VS2010 können Sie für eine Lambda-Funktion direkt gehen. for_each (meineListe.begin(), meineListe.end(), [] (int val) {Rückgabewert + Wert;}); –

+0

vs2005 ermöglicht dies auch, und auf einer Nebenbemerkung, GCC gibt eine ziemlich kryptische Fehler msg, wenn der Funktor Typ ist eine Vorlage:/(Ich lief dies beim Versuch zu kompilieren einige Code kompiliert völlig gut mit VS) – smerlin

5
  • Es ist illegal, bevor C++ 0x
  • In C++ 0x, gibt es eine bessere Lösung ist (Lambda/Schließungen)

So in jedem Fall, dass Sie eine andere Lösung verwendet werden sollen.

+0

nett zusammenfassend. –

Verwandte Themen