C ++ seltsame Syntax in Boost-Template-Parametern entdeckt

8

Ich habe mir die "Function" -Klassendokumentation in Boost angesehen und bin darüber gestolpert:

%Vor%

Ich muss zugeben, dass diese Syntax für mich sehr verwirrend ist. Wie kann das legales C ++ sein?

Gibt es irgendeinen Trick unter der Haube? Ist diese Syntax überall dokumentiert?

    
Dinaiz 27.06.2010, 00:31
quelle

1 Antwort

9

[Bearbeiten] Dies ist eine Antwort auf die ursprüngliche, unbearbeitete Frage des Autors, die eigentlich zwei Fragen waren.

  

Ich muss zugeben, dass diese Syntax hoch ist   verwirrend für mich. Wie kann das sein   legales C ++? :) Gibt es einen Trick?   unter der Haube ? Ist diese Syntax?   dokumentiert irgendwo?

Das ist absolut legal und es ist eigentlich nicht zu kompliziert.

%Vor%

Es ist im Grunde dasselbe wie:

%Vor%

Dieser Typ ist nicht nur C ++, sondern auch in C anwendbar (der tatsächliche Typ C ist parametrisiert). Die Template-Magie nimmt hier etwas wie den Function typedef und kann die Typen der Rückgabewerte und Argumente erkennen. Dies zu erklären, wäre hier zu langwierig und boost :: function verwendet eine Menge der Meta-Templates der Funktionsmerkmale in Boost, um diese Informationen abzurufen. Wenn Sie wirklich die Zeit dafür nutzen möchten, sollten Sie versuchen, die Boost-Implementierung zu verstehen, die mit boost :: function_traits in Boost.Type Traits beginnt.

Ich möchte jedoch auf Ihr generelles Problem eingehen. Ich denke, Sie versuchen zu sehr, ein paar Zeilen mit absolut akzeptablem Code zu vereinfachen. Es ist nicht falsch, die Argumente für Ihre Befehlsunterklassen über ihre parametrisierten Unterklassenkonstruktoren zu übergeben. Ist es wirklich Wert, versucht zu haben, hier Typlisten und boost :: function-like-Lösungen einzubinden, wodurch die Kompilierzeiten und Codekomplexität signifikant erhöht werden, nur dafür?

Wenn Sie es weiter reduzieren möchten, schreiben Sie einfach eine Ausführungsfunktion, die jede Befehlsunterklasse ausführt und sie dem Undo-Stack hinzufügt und so weiter:

%Vor%

Ich glaube wirklich, dass der Kompromiss, es komplizierter zu machen, es nicht wert ist. Die Boost-Autoren wollten eine extrem universelle Lösung für die boost :: function schreiben, die von vielen Leuten auf vielen Plattformen und Compilern verwendet würde. Sie haben jedoch nicht versucht, ein Befehlssystem zu verallgemeinern, das Funktionen mit unterschiedlichen Signaturen über ein einheitliches Undo-System ausführen kann (wodurch der Zustand dieser Befehle auch dann erhalten bleibt, wenn einer sie anfänglich aufruft und rückgängig gemacht werden kann) - Führen Sie sie aus, ohne die ursprünglichen Statusdaten bei nachfolgenden Ausführungen neu festzulegen. Dafür ist Ihr vererbungsbasierter Ansatz wahrscheinlich der beste und geradlinigste.

    
stinky472 27.06.2010, 02:09
quelle

Tags und Links