Question

Supposons que je dispose d’un ensemble de fonctions et de classes dont le modèle utilise une précision simple (float) ou double. Bien sûr, je ne pourrais écrire que deux morceaux de code bootstrap, ou jouer avec les macros. Mais puis-je changer d'argument de modèle au moment de l'exécution?

Était-ce utile?

La solution

Non, vous ne pouvez pas changer d'argument de modèle au moment de l'exécution, car les modèles sont instanciés par le compilateur au moment de la compilation. Ce que vous pouvez faire, c'est que les deux modèles dérivent d'une classe de base commune, utilisez toujours la classe de base dans votre code, puis choisissez la classe dérivée à utiliser au moment de l'exécution:

class Base
{
   ...
};

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

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

Les macros ont le même problème que les modèles, en ce sens qu'elles sont développées au moment de la compilation.

Autres conseils

Les modèles sont un mécanisme de compilation. BTW, les macros sont aussi (à proprement parler - un mécanisme de prétraitement - qui vient même avant la compilation).

Les modèles sont purement une construction de compilation, le compilateur développera un modèle et créera votre classe / fonction avec l'argument spécifié et le traduira directement en code.

Si vous essayez de basculer entre foo<float> et foo<double> au moment de l'exécution, vous devrez soit utiliser une supercherie de métaprogrammation, soit simplement disposer de chemins de code distincts pour chaque.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top