Pregunta

Supongamos que tengo un conjunto de funciones y clases que están diseñadas para usar un solo (float) o double precisión.Por supuesto, podría escribir solo dos fragmentos de código de arranque o manipular macros.¿Pero puedo simplemente cambiar el argumento de la plantilla en tiempo de ejecución?

¿Fue útil?

Solución

No, no puede cambiar los argumentos de plantilla en tiempo de ejecución, ya que el compilador crea instancias de plantillas en tiempo de compilación. Lo que puede hacer es que ambas plantillas se deriven de una clase base común, siempre use la clase base en su código y luego decida qué clase derivada usar en tiempo de ejecución:

class Base
{
   ...
};

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

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

Las macros tienen el mismo problema que las plantillas, ya que se expanden en tiempo de compilación.

Otros consejos

Las plantillas son un mecanismo de tiempo de compilación. Por cierto, las macros también lo son (estrictamente hablando, un mecanismo de preprocesamiento que viene incluso antes de la compilación).

Las plantillas son puramente una construcción en tiempo de compilación, el compilador expandirá una plantilla y creará su clase/función con el argumento especificado y lo traducirá directamente a código.

Si estás intentando cambiar entre foo<float> y foo<double> en tiempo de ejecución, necesitarás usar algún truco de metaprogramación o simplemente tener rutas de código separadas para cada uno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top