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
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.
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).
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.