Versioni con modelli di eseguibili?

5

Quindi sto creando un risolutore numerico che voglio usare per molti problemi / algoritmi. Nel modo in cui è scritto, esiste una classe generica chiamata "Algorithm_Scheme" (e file associati Algorithm_Scheme.h e Algorithm_Scheme.cpp) che è inclusa come membro della classe "Risolutore".

Per creare un eseguibile per un problema / algoritmo diverso, sostituisco il testo "Algorithm_Scheme" con il nome di schemi specifici che ho creato. Per esempio. "Logistic_Regression_Scheme", "Linear_Regression_Scheme", ecc. In questo modo posso creare un eseguibile diverso per ogni problema / algoritmo. C'è un modo migliore per farlo? Devo definire una macro? Quindi, ad esempio:

#define Algorithm_Scheme Logistic_Regression_Scheme

per creare i diversi eseguibili? Un problema è che dovrò cambiare l'# include per includere solo l'intestazione Algorithm_Scheme che voglio ... Quali sono i tuoi pensieri? Sto solo facendo la prima cosa che mi viene in mente. Non so quali sarebbero le migliori pratiche.

    
posta RobertHannah89 05.03.2017 - 00:10
fonte

1 risposta

2

Ad esempio, potresti utilizzare il modello di progettazione della strategia , il Solver è il contesto, Algorithm_Scheme essendo la strategia astratta e Logistic_Regression_Scheme , Linear_Regression_Scheme strategie concrete.

Tempo di esecuzione?

Puoi implementarlo in fase di runtime, istanziando la strategia giusta (ad esempio in base al parametro della riga di comando) usando la composizione nel risolutore:

 class Linear_Regression_Scheme : public Algorithm_Scheme{ ...}; 
 ...
   Logistic_Regression_Scheme my_scheme; 
   Solver my_solver(my_scheme);   // constructor will keep reference or pointer to scheme

In questo caso, dovrai includere tutte le intestazioni dei tuoi schemi. Tuttavia, se il solutore viene utilizzato in un contesto più ampio, e questo è davvero un problema molto serio per te, puoi anche usare l'idioma PIMPL, in modo che solo la sorgente del Risolutore debba includere tutti gli include e gli altri componenti del l'applicazione non deve sapere su questi dettagli.

O compile-time?

Ma se temi per le prestazioni, puoi usare i modelli per il polimorfismo in fase di compilazione. Dovresti quindi creare un'istanza del risolutore, con la strategia come argomento del modello:

 class Linear_Regression_Scheme { ...}; 
 ...
   Solver<Linear_Regression_Scheme> my_solver; 

In questo scenario, avresti bisogno di includere solo le intestazioni della strategia concreta che usi.

Commento generale

Normalmente in C ++, l'uso delle macro C dovrebbe davvero essere l'eccezione. In genere viene utilizzato per la compilazione condizionale, in particolare per includere le protezioni e per le condizioni da definire nel processo di generazione. Ma per altri usi, pensa prima a costanti e modelli.

    
risposta data 01.04.2017 - 19:15
fonte

Leggi altre domande sui tag