Selezionare il modello argomento in runtime C++
Domanda
Supponiamo di avere un insieme di funzioni e classi che sono basati su modelli per uso singolo (float
) o double
la precisione.Naturalmente potrei scrivere solo due pezzi di codice bootstrap, o pasticciare con le macro.Ma posso solo cambiare argomento del modello in fase di esecuzione?
Soluzione
No, non è possibile passare argomenti di modello in fase di esecuzione, dal momento che i modelli sono istanziati dal compilatore in fase di compilazione.Che cosa è può fare è di avere entrambi i modelli derivano da una classe base comune, sempre di utilizzare la base di classe 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 come modelli, che si sono espanse a tempo di compilazione.
Altri suggerimenti
I modelli sono un meccanismo in fase di compilazione. A proposito, anche le macro (a rigor di termini - un meccanismo di preelaborazione - che arriva anche prima della compilazione).
I modelli sono puramente un costrutto in fase di compilazione, il compilatore espanderà un modello e creerà la classe / funzione con l'argomento specificato e lo tradurrà direttamente in codice.
Se stai provando a passare da foo<float>
a foo<double>
in fase di runtime, dovrai usare qualche trucco di metaprogrammazione o avere solo percorsi di codice separati per ciascuno.