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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top