Ho il seguente problema:priorità nella scelta di funzioni modello sovraccarico in 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";
}
};
Se ora faccio
Derived derived;
Different different;
std::cout << "Derived: " << X::func(&derived) << std::endl;
std::cout << "Different: " << X::func(&different) << std::endl;
ottengo
Derived: Generic
Different: Generic
Ma quello che voglio è che per tutte le classi derivate da Base viene chiamato il metodo specifico. Così il risultato dovrebbe essere:
Derived: Specific
Different: Generic
C'è un modo per ridisegnare il X: func (...) s per raggiungere questo obiettivo?
EDIT:
Si supponga che non è conosciuto dal chiamante di X :: func (...) se la classe presentata come parametro è derivata dalla base oppure no. Quindi, Casting to Base non è un'opzione. In realtà l'idea alla base di tutto è che X :: func (...) dovrebbe 'rilevare' se il parametro è derivato da Base o no e chiama un codice diverso. E per motivi di prestazioni il 'rilevamento' dovrebbe essere fatto in fase di compilazione.
+1, avrei dovuto pensarci. Questo trucco è in realtà utilizzato molto in AWL per selezionare tra varie versioni di algoritmi basati sulla categoria degli iteratori passati. – avakar
Tenere a mente la versione Boost, tuttavia, funzionerà con altri tratti rispetto alla convertibilità. – avakar
grazie per la pubblicazione, è davvero una bella soluzione. – ttvd