es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Contenido del método de clase determinado por el valor de la plantilla

Usando c++ 14 o c++11, ¿tenemos un enfoque elegante para realizar la siguiente tarea? El número de miembros y el tipo de operaciones están determinados por el valor de entrada de la plantilla ‘count’

“`c++
template<int count="">
class show{
public:
run(){
if (count == 1){
int x;
} else if(count ==2){
int x, y;
}else if(count ==3){
int x, y, z;
}

<pre><code> if (count == 1){
printf("res: %d \n", x);
} else if(count ==2){
printf("res: %d \n", x+y);
}else if(count ==3){
printf("res: %d \n", x+y+z);
}

}
</code></pre>

};
“`

Actualización: ¿podemos utilizar especialización parcial o algo relacionado con la plantilla en este caso?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, podemos usar la especialización parcial en este caso para proporcionar un enfoque elegante para la tarea. En lugar de usar condiciones para definir el número de miembros y operaciones, podemos usar especialización parcial para definir la plantilla para cada posible valor de conteo.

    Aquí tienes un ejemplo de cómo podríamos usar la especialización parcial:

    “`c++
    template
    class show;

    template<>
    class show<1> {
    public:
    void run() {
    int x;
    printf(“res: %d \n”, x);
    }
    };

    template<>
    class show<2> {
    public:
    void run() {
    int x, y;
    printf(“res: %d \n”, x+y);
    }
    };

    template<>
    class show<3> {
    public:
    void run() {
    int x, y, z;
    printf(“res: %d \n”, x+y+z);
    }
    };


    Con este enfoque, ya no necesitamos usar condicionales para definir el número de miembros y operaciones, ya que la especialización parcial se encarga de eso por nosotros. Simplemente podemos usar el valor de conteo que queremos para instanciar la plantilla correcta: ```c++ show<1> s1; s1.run(); // imprimirá "res: {valor no definido}" show<2> s2; s2.run(); // imprimirá "res: {valor no definido}" show<3> s3; s3.run(); // imprimirá "res: {valor no definido}"

    Ten en cuenta que todavía necesitamos definir las variables miembro para cada valor de conteo, que en este ejemplo no están inicializadas y, por lo tanto, producirán un comportamiento indefinido. También podemos definir las variables miembro como parámetros de plantilla o como argumentos para el constructor para evitar este problema.

Comments are closed.