Wird CRTP häufig verwendet? und warum ist / ist es nicht? [geschlossen]

11

Ich denke über merkwürdig wiederkehrende Vorlagenmuster nach .

Ich finde es sehr nützlich und es ist ziemlich gut für viele Aufgaben einstellbar. Aber ich muss zugeben, ich sehe nicht viel CRTP-Code in freier Wildbahn.

Ist es schwer zu begreifen? Sind virtuelle Funktionen insgesamt einfacher? Sollte es nicht in 90% der Fälle verwendet werden, in denen ein virtuelles Schlüsselwort angezeigt wird?

Codierer
quelle

Antworten:

8

Die einfache Tatsache ist, dass viele, wenn nicht die meisten C ++ - Benutzer kaum verstehen können, dass dies vectorbesser ist als mallocund. Daher ist freedie Zahl derer, die die erweiterte Metaprogrammierung von Vorlagen nicht nur schätzen, sondern auch implementieren können, nicht sehr hoch. Dies bedeutet, dass selbst wenn es für 90% der Situationen gut wäre, Sie es in weit weniger sehen würden, einfach weil die Leute nicht darüber Bescheid wissen oder nicht wissen, wie man es benutzt.

Virtuelle Funktionen haben jedoch Vorteile, nämlich, dass virtuelle Funktionen viel einfacher zu verwenden sind als das CRTP. C ++ - Vorlagen sind dafür berüchtigt, über praktisch alles und jedes zickig zu sein, und das Einschlussmodell saugt Bälle.

Sie [virtuelle Funktionen] sind jedoch deutlich langsamer und weniger leistungsfähig. Zum Beispiel schreibe ich gerade Code über CRTP, wo Sie Operatorüberladungen zur Verwendung mit Ausdrucksvorlagen erben. Virtuelle Funktionen könnten dies unmöglich zum Funktionieren bringen.

DeadMG
quelle
1
Ist es nicht etwas ironisch, dass die Sprachfunktion, mit der CRTP die Verwendung von "virtuell" vermeidet, "praktisch" alles und jedes zickig macht?
Kaiserludi
6

WTL verwendet das CRTP. Der Chromium-Browser ist ein bekanntes Beispiel für Software, die WTL verwendet. Ich würde also sagen, dass sie "in the wild" verwendet wird.

Über die 90%? Das ist definitiv eine Übertreibung. Haben Sie jemals einen Behälter mit polymorphen Objekten verwendet? Das ist eine sehr häufige Verwendung von Polymorphismus, und Sie können dies mit CRTP nicht tun, da dies Base<DerivedA>nicht dasselbe ist wie Base<DerivedB>.

Tamás Szelei
quelle
-5

Hier sind Gründe, warum es nicht weiter verbreitet ist:

  1. Es ist ein Hack
  2. Als Hack kann nicht garantiert werden, dass Sie bei der Verwendung keine Probleme bekommen. Das normale OO-Material wurde von einer großen Anzahl von Projekten verwendet und funktioniert ordnungsgemäß. Probleme sind bekannt. Das CRTP wird nur in einer kleinen Anzahl von Projekten gefunden, und es sind keine Daten verfügbar
  3. Es gibt keinen guten Grund, es zu verwenden - die meisten Gründe sind einfach nicht gültig
  4. es kann einige Dinge komplizierter machen
tp1
quelle
11
Es ist mit Sicherheit kein Hack. Das Verhalten ist sehr gut definiert und wird häufig verwendet.
DeadMG
5
Ja, die ganze STL ist ein großer Hack.
Abyx
Kannst du deine Antwort bearbeiten und erklären, warum es ein Hack ist?
Nick