EDIT: nota che voglio un metodo di compilazione static , quando so esattamente cosa deve andare dove in fase di compilazione.
Spesso mi capita di avere più funzioni che seguono lo stesso schema, ma solo alcune parti cambiano. Spesso scelgo il Pattern Method Template, tuttavia approcci basati su classi (specialmente in c ++) sembrano molto ingombranti. Sono spesso costretto a creare oggetti reali quando davvero tutto ciò che sto cercando di fare è cambiare una riga per un'altra che non può essere anteposta o aggiunta alla routine che sto scrivendo, dove idealmente vorrei semplicemente generare un funzione data un pattern in fase di compilazione. Ho anche bisogno di creare classi private / protette dove la procedura abbia senso solo nella classe che sto usando. Tutto ciò sembra un enorme spreco.
Mi piacerebbe un approccio statico a questo, in cui so esattamente quale funzione mi piacerebbe utilizzare in ogni situazione, ma non voglio il codice duplicato tra ogni funzione in cui solo una piccola quantità cambia E 'possibile in qualcosa come C ++ senza ricorrere alla creazione di classi personalizzate per ogni caso questo accade? Ci sono "soluzioni" come la creazione di diverse funzioni personalizzate per ogni passaggio, ma senza TMP queste funzioni si accoppiano ad un alto livello e richiedono più parametri per essere passati intorno a quanto normalmente necessario, e non sembrano mai davvero liberarsi della duplicazione del codice .
MODIFICA l'esempio più recente che ho trovato da quando mi è stato chiesto degli esempi ...
class X{
A m_class_member_1;
B m_class_member_2;
C m_class_member_3;
D m_class_member_4;
E m_class_member_5;
...
void duplicateProcedure_1(){
auto some_value = m_class_member_1.function();
if(valuePassesTest(some_value)){
auto some_other_value = m_class_member_2.function(some_value);
m_class_member_3.function(some_other_value);
m_class_member_4.function(some_other_value);
// changed procedure
m_class_member_5.function_1(some_other_value);
}
}
void duplicateProcedure_2(){
auto some_value = m_class_member_1.function();
if(valuePassesTest(some_value)){
auto some_other_value = m_class_member_2.function(some_value);
m_class_member_3.function(some_other_value);
m_class_member_4.function(some_other_value);
//changed procedure
m_class_member_5.function_2(some_other_value);
}
}
}
l'ultima riga in ciascuna è l'unica cosa che deve essere cambiata, tutto il resto deve essere uguale, ma dipendono anche dalle variabili create con la procedura, nonché dalle condizioni esterne all'ambito del loro blocco.