¿Cómo pasar una instancia de plantilla de C++ a una función?
¿Cómo puedo pasar cualquier objeto de una clase con plantillas a otra función en C++11?
En el fragmento de código a continuación, passInObj
no se compila porque se queja de Printer&
. Quiero pasar cualquier Printer
, no importa qué plantilla T
haya usado.
¿Cómo puedo hacer esto y por qué no funciona la solución a continuación?
“`
#include <iostream>
#include <vector>
template <typename t="">
class Printer {
public:
Printer(const T& tl) : t(tl) {}
void print() const {
for (auto x : t) {
std::cout << x << std::endl;
}
}
const T&t;
};
// ESTA LÍNEA NO SE COMPILA
void passInObj(const Printer& p) {
p.print();
}
int main() {
std::vector<std::string> vec;
vec.push_back("ABC");
Printer<><std::string>> printer(vec);
printer.print();
passInObj(p);
return 0;
}
“`
davy.ai
En C++11, puedes pasar cualquier objeto de una clase templada a otra función utilizando plantillas. Necesitas usar un parámetro de plantilla en la firma de la función para aceptar cualquier tipo de
Printer
.Para solucionar el error de compilación en el fragmento de código, cambia la firma de
passInObj
para aceptar cualquier tipo dePrinter
como un parámetro de plantilla:Esto permite pasar cualquier objeto
Printer
de cualquier tipoT
a la función, siempre y cuando el objeto se pase como referencia (&
) para evitar el corte de objetos.La solución a continuación no funciona porque la firma de la función utiliza una referencia no plantillada a
Printer
, lo que significa que la función solo puede aceptar objetos de tipoPrinter
que tienen un argumento de plantilla específico, no cualquier objetoPrinter
.