tengo el siguiente problema:prioridad al elegir las funciones de plantilla sobrecargados en C++
class Base
{
};
class Derived : public Base
{
};
class Different
{
};
class X
{
public:
template <typename T>
static const char *func(T *data)
{
// Do something generic...
return "Generic";
}
static const char *func(Base *data)
{
// Do something specific...
return "Specific";
}
};
Si ahora hago
Derived derived;
Different different;
std::cout << "Derived: " << X::func(&derived) << std::endl;
std::cout << "Different: " << X::func(&different) << std::endl;
me sale
Derived: Generic
Different: Generic
Pero lo que yo quiero es que para todas las clases derivadas de Base se llama el método específico. Así, el resultado debería ser:
Derived: Specific
Different: Generic
¿Hay alguna manera de poder rediseñar el X: func (...) s para alcanzar este objetivo?
EDIT:
asumir que no es conocido por la persona que llama de X :: func (...) si la clase presentada como el parámetro se deriva de la base o no. Así que Casting to Base no es una opción. De hecho, la idea detrás de todo esto es que X :: func (...) debería 'detectar' si el parámetro se deriva de Base o no y llamar a un código diferente. Y por motivos de rendimiento, la "detección" debe realizarse en tiempo de compilación.
+1, debería haberlo pensado. Este truco se usa mucho en STL para seleccionar entre varias versiones de algoritmos basados en la categoría de iteradores pasados. – avakar
Sin embargo, tenga en cuenta la versión de Boost, funcionará con otros rasgos además de la convertibilidad. – avakar
gracias por publicar, de hecho es una buena solución. – ttvd