Sto provando a creare un algoritmo generico. Finora ho raggiunto questo gerarchia di classi utilizzando e puntatori, come nell'esempio qui sotto:Polimorfismo C++ statico piuttosto che dinamico
struct Base{
virtual double fn(double x){return 0;}
};
class Derived : public Base{
double A;
public:
Derived(double a) : A(a) {}
double fn(double x) { return A*x;}
};
//Some other implementations
class algo{
double T;
std::unique_ptr<Base> b_ptr;
public:
algo(double t, std::unique_ptr<Base>& _ptr); //move constructor...
//Some constructors
double method(double x){ return T*b_ptr->fn(x);}
};
Questo set up viene quindi implementato come segue:
int main(){
std::unique_ptr<Derived> ptr(new Derived(5.4));
algo(3.2,ptr);
method(2.4);
return 0;
}
Questo è un esempio molto semplice, naturalmente , ma serve per la mia domanda. Da quello che ho capito, l'uso di classi derivate in questo modo significa che il metodo viene scelto in fase di esecuzione piuttosto che in fase di compilazione. Dal momento che non ho bisogno di alcun comportamento dinamico dal mio algoritmo - tutto è determinato al momento della compilazione - questa è una perdita inutile di efficienza. C'è un modo per fare quanto sopra al momento della compilazione, cioè il polimorfismo statico?
Da quello che ho capito, è possibile ottenere solo il polimorfismo statico utilizzando i modelli. Tuttavia, non sono stato in grado di trovare modelli di attrezzo con tipi non primitivi. Come nell'esempio sopra, ho bisogno di classi derivate con costruttori non predefiniti, il che non sembra possibile ... Qualcuno potrebbe offrire qualche soluzione su come ciò potrebbe essere fatto?
tua osservazione circa inutili il comportamento dinamico è astuto: dovresti avere una gerarchia di classe polimorfa solo se * devi * rimandare la decisione di quale tipo effettivo hai bisogno di runtime. Buoni esempi sono l'analisi di messaggi da un protocollo di rete o la gestione di eventi in un ciclo di eventi. Altrimenti, se effettivamente * conosci * di quale tipo hai bisogno, il polimorfismo con funzione virtuale non è lo strumento giusto. –
'È possibile ottenere solo il polimorfismo statico usando i modelli 'Il polimorfismo consiste nel chiamare la funzione corretta di base sul tipo di oggetto corrente. Quindi mi piacerebbe dire che il sovraccarico di funzione è anche polimorfismo statico. – ZijingWu