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.

Clase de impresión de objetos utilizando plantillas variádicas.

Estoy tratando de entender el plegado y las plantillas variádicas.
He diseñado una clase Tuple muy ingenua. Puedo crear un objeto tuple, pero me gustaría imprimir el objeto. Parece extraño que este problema no se haya abordado casi en ningún lugar (al menos no he encontrado ningún recurso hasta ahora.
Este es el código

#include <iostream>
#include <string>

// esta es la implementación de mi propia tupla usando plantillas variádicas
template <class... t="">
class Tuple {};

template <class t,="" class...="" args="">
class Tuple<t, args...=""> {
private:
    T primero;
    Tuple<args...> resto;
public:
    // amigos
    friend std::ostream& operator<<(std::ostream& out, const Tuple<t, args...="">& tupla);

public:
    Tuple(T&& primero, Args&&... resto): primero(primero), resto(resto...){};
};

template <class t,="" class...="" args="">
std::ostream& operator<<(std::ostream& out, const Tuple<t, args...="">& tupla){
    out << tupla.primero;
    ((out << " - " << std::forward<args>(tupla.resto)), ...);
    return out;
}

Probablemente Tuple<T, Args...> es incorrecto, y la línea donde estoy usando el plegado no tiene sentido. Realmente no puedo encontrar una forma de hacer que esto funcione. ¿Alguien puede ayudar?</t,></t,></args…></t,></class…>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no puedo compilar ni probar el código por ti. Sin embargo, hay algunos problemas con la implementación actual que podrían estar causando problemas:

    1. El primer problema es que la clase Tuple<t, args...=""> no tiene un constructor por defecto. Por lo tanto, cuando se crea de forma recursiva el miembro rest de la clase, no hay forma de crear el caso base. Una forma de resolver esto es añadir un constructor por defecto a la clase base Tuple<>, que simplemente no haga nada.
    2. El segundo problema está en la definición de la función std::ostream& operator<<. El paquete de parámetros Args no debería tener el & al final de su nombre. Esto está causando un error en tiempo de compilación porque Args... no es una lista de parámetros de plantilla válida.

    3. Por último, la expresión de plegado ((out << " - " << std::forward<args>(tuply.rest)), ...) no es correcta. La intención es imprimir todos los elementos de la tupla, pero actualmente sólo se está imprimiendo el último elemento. Una forma de resolver esto es añadir otro caso base a la expresión de plegado, así: ((out << " - " << std::forward<args>(tuply.rest)), ...) << std::endl;.

    Con estos cambios, el código debería funcionar correctamente:

    “`cpp
    #include
    #include

    template <class… t=””>
    class Tuple {};

    template <>
    class Tuple<> {};

    template
    class Tuple<t, args…=””> {
    private:
    T first;
    Tuple<args…> rest;

    public:
    Tuple() {}
    Tuple(T&& firsty, Args&&… resty)
    : first(firsty)
    , rest(std::forward(resty)…)
    {}

    friend std::ostream& operator<<(std::ostream& out, const Tuple<t, args...="">& tuply) {
        out << tuply.first;
        ((out << " - " << std::forward<args>(tuply.rest)), ...) << std::endl;
        return out;
    }
    

    };

    int main() {
    Tuple<int, std::string,=”” double=””> t(42, “hello”, 3.14);
    std::cout << t;
    return 0;
    }
    “`</int,></t,></args…></t,></class…></t,>

Comments are closed.