Ho una domanda su un codice che ho recentemente preso tra le mani. Voglio solo sapere se in C++ template paradigma è corretto o utile per effettuare le seguenti eredità (solo 3 classi come esempio):Ereditarietà da un modello C++
template< class I, class P, class D, unsigned int ID = 0 >
class PathFilter : public Filter< I, P, 1 >
{
...
}
template< class I, class A, unsigned int N = 1 >
class Filter : public Algorithm< I, A >
{
...
}
template< class I, class A >
class Algorithm : public A //This line
{
...
}
La mia domanda riguarda specificamente l'ereditarietà nel terzo esempio. È utile renderlo così "generico" e non preciso? È una buona scelta per compromettere il codice comprensibile con un codice più generico?
Chiedo innanzitutto perché non sono un esperto di modelli C++, ma anche perché vedo questo codice difficile da capire usando i modelli (di solito i nomi dei modelli non dicono nulla sul suo contenuto). Qualche consiglio?
Quindi, se è quello che vuoi, va bene. Per quanto riguarda la leggibilità, è vero, esiste una tradizione di denominare i parametri del modello in modo strano: I, P, A, ecc. Ma non è necessario :). Dai loro nomi migliori e potrebbero diventare auto-descrittivi. –
Grazie per la risposta, ma ho ancora una domanda. Comprendo l'uso di una definizione generale e astratta di alcune funzionalità in una classe "superiore". Ma l'obiettivo principale di un modello non è quello di generalizzare i tipi di parametri? Quindi quello che sto dicendo alla fine è che posso passare quasi tutto a questa classe superiore e conservare le funzioni di una gerarchia inferiore. Alla fine avrò un insieme molto ristretto di oggetti che possono ereditare (forse uno) le funzioni inferiori, sbaglio? Non è un modo poco pratico per definire questa genericità? –
Hai ragione.Sicuramente solo un insieme specifico di classi 'A' si adatta in' Algorithm 'eventualmente permettendo la compilazione (quelle' A' devono in qualche modo implementare un'interfaccia specificata da 'Algorithm <>'). Ora state usando il modello per scopi di progettazione. Quello che vuoi fare è scrivere 'Algorithm <>' una volta e avere diversi algoritmi (es. 'Algorithm', 'Algorithm ', ...) semplicemente scrivendo piccoli pezzi di codice in più (cioè classi 'RungeKutta',' Symplectic' ...). In qualche modo sei ancora generale rispetto al tipo. –
Acorbe