Was ist der Vorteil des Typs "function" (nicht "pointer to function")?

9

Wenn ich den C ++ Standard lese, sehe ich, dass es "Funktion" -Typen und "Zeiger auf Funktion" -Typen gibt:

%Vor%

Ich habe nie die Funktionstypen außerhalb von Beispielen gesehen (oder vielleicht habe ich ihre Verwendung nicht erkannt?). Einige Beispiele:

%Vor%

Da die Funktionstypen eine Syntax unterstützen, die nicht in C erscheint (Deklaration von Member-Funktionen), sind sie nicht nur ein Teil von C-Baggage, das C ++ aus Gründen der Abwärtskompatibilität unterstützen muss.

Gibt es also irgendeine Verwendung für Funktionstypen, abgesehen von der Demonstration einiger funky Syntax?

    
anatolyg 21.12.2010, 07:33
quelle

4 Antworten

0

Ein Beispiel dafür, warum dies nützlich ist, ist boost , wo Sie das oft sehen. Zum Beispiel in der signals2-Bibliothek:

%Vor%

Dabei deklariert das obige Signal ein Signal, das jede Funktion akzeptiert, die zwei Inits benötigt und einen Rückgabewert vom Typ void hat.

    
villintehaspam 21.12.2010, 11:13
quelle
4

Auf der einen Seite scheinen Sie im Allgemeinen über Funktionstypen zu sprechen. Auf der anderen Seite scheint es, dass Ihre Frage in Wirklichkeit die Verwendbarkeit von typedef-Namen für Funktionstypen betrifft.

Die Funktionstypen selbst sind ein grundlegendes Konzept, das in C- und C ++ - Sprachen integriert ist. Sie werden die ganze Zeit benutzt. Du kannst einfach nicht ohne sie leben. Jedes Mal, wenn Sie eine Funktion deklarieren, deklarieren Sie eine Entität des Funktionstyps. Jedes Mal, wenn Sie einen Zeiger auf eine Funktion verwenden, verwenden Sie einen Zeiger auf den Funktionstyp. Etc.

Was die Möglichkeit angeht, typedef-Namen für Funktionstypen zu machen ... sehe ich nicht viel dafür. Es ist, glaube ich, ein Teil von C-Gepäck, das ein wenig für C ++ erweitert wurde, nur weil es einfach zu machen war.

Wie Sie richtig notierten, können typedef-Namen für Funktionstypen verwendet werden, um Elementfunktionen zu deklarieren (und in C ++ können Sie auch const specifier in typedef einfügen, wie in typedef int MemberType() const; ), aber z. B. nicht Verwenden Sie diese Funktion mit Funktionstypen, die als Vorlagenparameter übergeben wurden.

    
AnT 21.12.2010 07:48
quelle
0

boost: function verwendet diese Syntax, die "bevorzugte" Syntax genannt wird.
Scheint diese Art von Syntax nicht weit verbreitet? Vergleichen mit Funktionszeiger.

    
wqking 21.12.2010 07:48
quelle
0

Sie sehen es in den neuen Funktionsobjekten in Boost / TR1 / C ++ 0x.

std::function<void()> akzeptiert jedes Objekt mit einem Operator (), der void zurückgibt und keine Argumente annimmt.

    
Puppy 21.12.2010 11:00
quelle

Tags und Links