Verwenden Sie seltsam wiederkehrendes Template Pattern (CRTP) mit zusätzlichen Typparametern

7

Ich versuche, das Curiously Recurring Template Pattern (CRTP) zu verwenden und zusätzliche Typparameter zur Verfügung zu stellen:

%Vor%

Dies ist wahrscheinlich ein Fehler, die geeignetere Oberklasse wäre Base<A, double, int> - obwohl diese Nichtübereinstimmung der Argumentreihenfolge nicht so offensichtlich ist. Dieser Fehler wäre einfacher zu sehen, wenn ich die Bedeutung der Parameter in einem typedef mit name bezeichnen könnte:

%Vor%

Allerdings kompiliert dies nicht auf gcc 4.4, die gemeldeten Fehler werden als Kommentare oben gegeben - ich denke der Grund ist, dass vor dem Erstellen von A, es die Basis-Vorlage instanziieren muss, aber das wiederum müsste A wissen .

Gibt es eine gute Möglichkeit, "benannte" Template-Parameter während der Verwendung von CRTP zu übergeben?

    
hrr 15.04.2011, 17:25
quelle

3 Antworten

19

Sie können eine Merkmalsklasse verwenden:

%Vor%     
James McNellis 15.04.2011, 17:29
quelle
9

@ James Antwort ist offensichtlich richtig, aber Sie könnten immer noch einige Probleme haben, wenn der Benutzer nicht korrekte typedefs bietet.

Es ist möglich zu "behaupten", dass die verwendeten Typen richtig sind, indem Sie die Kompilierzeit-Prüfmöglichkeiten verwenden. Abhängig von der Version von C ++, die Sie verwenden, können Sie Boost verwenden.

In C ++ 0x geschieht dies durch Kombination von:

  • static_assert : eine neue Möglichkeit zur Überprüfung der Kompilierzeit, mit der Sie eine Nachricht
  • angeben können
  • die Überschrift type_traits , die einige Vergleichselemente wie std::is_integral oder std::is_floating_point enthält

Beispiel:

%Vor%

Dies ist den typischen defensiven Programmier Idiomen in der Laufzeitumgebung sehr ähnlich.

    
Matthieu M. 15.04.2011 18:15
quelle
1

Sie brauchen eigentlich gar nicht die Merkmalsklassen. Folgendes funktioniert auch:

%Vor%     
Ben 24.10.2013 12:35
quelle