CRTP è molto usato? e perché è / non è? [chiuso]


11

Sto pensando a un modello di modello curiosamente ricorrente .

Lo trovo abbastanza utile ed è abbastanza ben regolabile per molte attività. Ma devo ammettere che non vedo molto del codice CRTP in natura.

È difficile da capire? Le funzioni virtuali sono più semplici nel complesso? Non dovrebbe essere usato per il 90% dei casi in cui appare una parola chiave virtuale?

Risposte:


8

Il semplice fatto è che molti, se non la maggior parte, gli utenti C ++ riescono a malapena a capire che vectorè meglio di malloce free, quindi il numero che non solo può apprezzare ma implementare la metaprogrammazione di template avanzata non è molto alto. Ciò implica che anche se fosse buono per il 90% delle situazioni, lo vedresti molto meno, semplicemente perché le persone non lo sanno o come usarlo.

Tuttavia, le funzioni virtuali non hanno vantaggi, cioè, funzioni virtuali sono molto più facili da utilizzare rispetto al CRTP. I modelli C ++ sono noti per essere bizzarri praticamente su qualsiasi cosa e il modello di inclusione fa schifo alle palle.

Tuttavia, esse [funzioni virtuali] sono nettamente più lente e meno potenti. Ad esempio, in questo momento sto scrivendo codice utilizzando il CRTP, dove erediti i sovraccarichi dell'operatore da utilizzare con i modelli di espressioni. Non è possibile che funzioni virtuali possano farlo funzionare.


1
Non è in qualche modo ironico che la caratteristica stessa del linguaggio che CRTP utilizza per evitare l'uso di "virtuale" sia strana di "praticamente" qualsiasi cosa?
Kaiserludi,

6

WTL utilizza il CRTP. Il browser Chromium è un noto esempio di software che utilizza WTL, quindi direi che viene utilizzato "in the wild".

Circa il 90%? Questa è sicuramente una sopravvalutazione. Hai mai usato un contenitore di oggetti polimorfici? Questo è un uso molto comune del polimorfismo e non puoi farlo con CRTP perché Base<DerivedA>non è lo stesso Base<DerivedB>.


-5

Ecco i motivi per cui non viene utilizzato più ampiamente:

  1. È un trucco
  2. Come hack, non è garantito che tu non abbia problemi quando lo usi. Il normale materiale OO è stato utilizzato da un gran numero di progetti e si è riscontrato che funziona correttamente / i problemi sono ben noti, il CRTP si trova solo in un numero limitato di progetti e non sono disponibili dati
  3. non c'è alcun buon motivo per usarlo - la maggior parte dei motivi situati non sono validi
  4. può rendere alcune cose più complicate

11
Non è certo un hack. Il comportamento è molto ben definito e ne è ampiamente utilizzato.
DeadMG

5
Sì, l'intero STL è un grande trucco.
Abyx,

puoi modificare la tua risposta e spiegare, perché è un hack?
Nick,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.