Utilizzando VC++ 2010, data la seguente:Perché il compilatore sceglie questa funzione modello su una funzione non modello sovraccaricata?
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
vorrei "B" per essere chiamato in precedenza. Posso ottenere questo risultato con un cast a Base
, ma perché è necessario?
Desidero richiamare la funzione template per tutti i tipi non derivati da Base
(tipi incorporati, ecc.), Ma desidero che il sovraccarico non di modello venga chiamato per i tipi derivati da Base
, senza richiedere il client cast esplicito. Ho anche provato a rendere il sovraccarico una specializzazione del modello, ma lo stesso comportamento si verifica in quel caso. Qual è il modo idiomatico per ottenere ciò che sto cercando?
Si tratta di una cosa C++ 11 o funziona anche nel vecchio codice - basta chiedere perché è bello :)? –
@ w00te: 'is_base_of' e' enable_if' sono inclusi in Boost, C++ TR1 e C++ 11. Per loro non è richiesta alcuna funzionalità C++ 11; puoi definirli usando solo le caratteristiche del linguaggio C++ 03. –
@ w00te: puoi farlo in C++ 03, ma devi prendere 'enable_if' e' is_base_of' da boost (o lanciare il tuo, questo ti insegnerà alcune cose su C++). –