Ottieni o deduci il tipo di modello dal membro ereditato

1

Quindi ho un incarico dal college dove devo applicare più metaeuristiche a problemi diversi. Ho pensato che avrei dovuto rendere tutto quanto più modulare e riutilizzabile possibile per riutilizzare la metaeuristica con diversi problemi con il minimo cambiamento possibile.

Ho bisogno di queste classi:

  • Soluzione
  • NeighbourOperator
  • ExplorationStrategy
  • metaeuristica

Inizialmente pensavo che Metaheuristic conterrebbe un ExplorationStrategy che conterrebbe un NeighbourOperator . La strategia riceverebbe una soluzione e restituirebbe un vicino in base ai suoi membri. La strategia di esplorazione e metaheuristc avrebbero la classe della soluzione come modello.

Il mio ideale main.cpp dovrebbe essere:

SomeProblemSolution<int> solt = randomGeneratedSolution();
SomeNeighbourOperator op;
SomeExplorationStrategy<SomeProblemSolution> strat(op);
SomeMetaheuristic<SomeProblemSolution> mthr(strat);

mthr.apply(solt);

Ma questo è come apparirebbe il codice:

SomeProblemSolution<int> solt = randomGeneratedSolution();
SomeNeighbourOperator<int> op;
SomeExplorationStrategy<SomeProblemSolution, int> strat(op);
SomeMetaheuristic<SomeProblemSolution, int> mthr(strat);

mthr.apply(solt);

Ora ogni classe che interagisce con una soluzione richiede un modello.

template<class T>
class NeighOperator {
    public:
        virtual void applyOp(Solution<T> &, int) = 0;
....

template<class T, class S>
class NeighExplorator {
    protected:
        NeighOperator<S> *_neighOperator;

    public:
        virtual T exploreNg(T &sol) = 0;
....

Quindi

C'è qualche errore di progettazione con cui ho bisogno del tipo di modello della soluzione in ogni altra classe?

Esiste comunque la possibilità di rendere il programma generico in modo da utilizzare solo il tipo di modello (quello che rappresenta la soluzione) in Soluzione e non in tutti i punti in cui è implicata una soluzione?

Sto facendo qualcosa di sbagliato con i modelli (dovrei in qualche modo dedurre il tipo) o dovrei solo essere amico delle classi di cui ho bisogno?

Qualsiasi aiuto è molto apprezzato.

    
posta carloscb 26.04.2016 - 23:44
fonte

1 risposta

0

Is there any design error by which I need the template type of the solution in every other class?

Tale dipendenza è abbastanza comune nei framework Genetic Algorithm / Genetic Programming e non è per sé un errore di progettazione.

Ci sono due motivi per cui il tuo codice appare in questo modo:

  • le classi che interagiscono con Solution s spesso hanno bisogno di memorizzarle (prove, le migliori finora ...) o classi che dipendono da loro.

    La cancellazione dei caratteri (ad es. boost::any ) non si combina bene e boost::variant introduce vincoli indesiderati.

  • i modelli di funzione membro non possono essere dichiarati virtuali ma i metodi virtuali sono spesso una necessità (nel tuo snippet applyOp , %codice%...). Al contrario, i membri ordinari dei modelli di classe possono essere virtuali e questo è un ulteriore "incentivo".

Considera che i parametri del modello di modello (e i buoni valori predefiniti) potrebbero essere un modo per ridurre la complessità percepita dell'uso del biblioteca e aiuto con il coordinamento dei tipi tra le varie classi.

    
risposta data 27.04.2016 - 16:09
fonte

Leggi altre domande sui tag