C'è un idioma C++ meno comune che ho usato con buoni risultati alcune volte in passato. Non riesco a ricordare se ha un nome generalmente usato per descriverlo.Derivazione Just-In-Time
È in qualche modo correlato a mixins, CRTP e type-erasure, ma non è specificamente una di quelle cose.
Il problema si verifica quando si desidera aggiungere un'implementazione a una classe, ma non si desidera inserirlo nella classe nella classe o in qualsiasi classe da essa derivata. Una ragione potrebbe essere che la classe potrebbe essere parte di una gerarchia di ereditarietà in cui l'implementazione dovrebbe avvenire solo una volta.
Accantonando, per il momento, problemi come se una gerarchia dovrebbe avere classi concrete non foglia o se l'ereditarietà virtuale può essere un'opzione in alcuni casi, so che una soluzione per fornire l'implementazione in un modello classe che deriva dal suo parametro template. Questo ti consente quindi di usare il modello quando crei un'istanza, ma poi usa sempre l'oggetto solo con il puntatore o con il riferimento a una delle sue basi (è qui che entra in scena la cancellazione del testo, in senso ampio).
Un esempio potrebbe essere il numero di riferimenti intrusivi. Tutte le tue classi derivano da un'interfaccia di conteggio ref, ma vuoi solo che il conteggio ref stesso e l'implementazione dei tuoi metodi di conteggio ref vengano visualizzati una volta, quindi li metti nel template derivato - chiamiamolo ImplementsRC<T>
. Ora è possibile creare un'istanza in questo modo:
ConcreteClass* concrete = new ImplementsRC<ConcreteClass>();
io sto passando sopra le cose come costruttori di inoltro formate da più sovraccarichi su modelli ecc
Così, si spera che ho messo in chiaro ciò che il linguaggio è. Ora tornando alla mia domanda - c'è un nome accettato, o almeno generalmente usato per questo idioma?
Sembra in qualche modo correlato al pattern Visitor o al Polymorphism esterno ... ma non del tutto. –
Non vedo davvero come sia collegato a uno di quei modelli - cura di elaborare? – philsquared
In che modo non è CRTP? –