¿Hay alguna forma de determinar el tipo de variable pasada a una plantilla y llamar a una función según si es int
o std::string
, etc.?Realizar diferentes métodos basados en la variable de plantilla tipo
Por ejemplo
template <class T>
struct Jam
{
Jam(T *var)
{
if (typeid(var) == typeid(std::string*)
*var = "Hello!";
else if (typeid(var) == typeid(int*)
*var = 25;
}
};
Cuando trato de usar el código, me sale un error invalid conversion from const char* to int
. Sospecho que esto se debe a que el compilador "expande" la plantilla en funciones separadas y cuando especifiqué una nueva instancia de la estructura throw Jam<std::string>(&setme);
detectó la declaración var* = 25
y se negó a compilar.
¿Hay una forma adecuada de hacerlo? Tal vez con macro guardias? Gracias.
Existen otras alternativas, como por ejemplo, especializar solo el constructor ('template <> Jam :: Jam (int * var) {}' fuera de la definición de clase de plantilla) o SFINAE más complejo para activar/desactivar código basado en los argumentos de la plantilla ... No creo que tenga sentido en este simple problema, pero podría tener sentido cuando estas soluciones simples se conviertan en una carga (digamos que el constructor hizo 100 cosas, de las cuales solo una depende del tipo , o que había otras 100 funciones miembro y la especialización del tipo completo sería costoso) –