usando VC++ 2010, teniendo en cuenta lo siguiente:¿Por qué el compilador elige esta plantilla sobre una función no plantilla sobrecargada?
class Base { };
class Derived : public Base { };
template<class T> void foo(T& t); // A
void foo(Base& base); // B
Derived d;
foo(d); // calls A
foo(static_cast<Base&>(d)); // calls B
me gustaría "B" para ser llamado anteriormente. Puedo lograr esto con un molde a Base
, pero ¿por qué es esto necesario?
Quiero la función de plantilla que se llama para todos los tipos no derivados de Base
(tipos incorporados, etc.), pero quiero que la sobrecarga no molde a ser llamado para este tipo de derivados de Base
, sin que se requiera el cliente para emitir explícitamente. También intenté convertir la sobrecarga en una especialización de la plantilla, pero el mismo comportamiento ocurre en ese caso. ¿Cuál es la forma idiomática de obtener lo que estoy buscando?
¿Esto es algo de C++ 11 o también funciona en código anterior? Solo pregunta porque es genial :)? –
@ w00te: 'is_base_of' y' enable_if' están incluidos en Boost, C++ TR1 y C++ 11. No se requiere funcionalidad C++ 11 para ellos; puede definir estos utilizando solo características de lenguaje C++ 03. –
@ w00te: puedes hacerlo en C++ 03, pero tienes que tomar 'enable_if' y' is_base_of' de boost (o lanzar el tuyo, esto te enseñará algunas cosas sobre C++). –