2009-03-03 5 views
8

Supponiamo di disporre di un set di funzioni e classi che sono utilizzate per utilizzare la precisione singola (float) o double. Ovviamente potrei scrivere solo due pezzi di codice di bootstrap o un pasticcio di macro. Ma posso semplicemente cambiare argomento template in runtime?Selezionare argomento template in fase di esecuzione in C++

risposta

19

No, non è possibile cambiare gli argomenti del modello in fase di esecuzione, poiché i modelli vengono istanziati dal compilatore in fase di compilazione. Quello che può fare è di avere entrambi i modelli derivano da una classe base comune, usare sempre la classe di base nel codice, e poi decidere quale classe derivata da utilizzare in fase di esecuzione:

class Base 
{ 
    ... 
}; 

template <typename T> 
class Foo : public Base 
{ 
    ... 
}; 

Base *newBase() 
{ 
    if(some condition) 
     return new Foo<float>(); 
    else 
     return new Foo<double>(); 
} 

macro hanno lo stesso problema di modelli, in quanto sono espansi in fase di compilazione.

3

I modelli sono un meccanismo in fase di compilazione. A proposito, anche i macro (in senso stretto - un meccanismo di pre-elaborazione - che viene prima della compilazione).

2

I modelli sono puramente un costrutto di tempo di compilazione, il compilatore espande un modello e crea la classe/funzione con l'argomento specificato e lo traduce direttamente nel codice.

Se si sta tentando di passare tra foo<float> e foo<double> in fase di esecuzione, è necessario utilizzare alcuni trucchi metaprogrammazione o semplicemente avere percorsi di codice separati per ciascuno.