Esiste un modo per determinare il tipo di variabile passato a un modello e chiamare una funzione basata su se è unoo std::string
ecc.?Eseguire diversi metodi basati sul tipo di variabile modello
Per esempio
template <class T>
struct Jam
{
Jam(T *var)
{
if (typeid(var) == typeid(std::string*)
*var = "Hello!";
else if (typeid(var) == typeid(int*)
*var = 25;
}
};
Quando provo ad utilizzare quel codice, ottengo un errore invalid conversion from const char* to int
. Sospetto che ciò avvenga perché il compilatore "espande" il modello in funzioni separate e quando ho specificato una nuova istanza della struttura throw Jam<std::string>(&setme);
ha rilevato l'istruzione var* = 25
e si è rifiutata di compilare.
Esiste un modo corretto per farlo? Forse con le macro guardie? Grazie.
Esistono altre alternative, ad esempio la specializzazione solo del costruttore ('template <> Jam :: Jam (int * var) {}' esterno alla definizione della classe template) o più complesso SFINAE per abilitare/disabilitare il codice basato sugli argomenti del template ... Non penso che abbia senso in questo semplice problema, ma potrebbe avere senso quando queste semplici soluzioni diventano un peso (diciamo che il costruttore ha fatto 100 cose, solo una delle quali dipende dal tipo o che ci fossero altre 100 funzioni membro e che specializzasse l'intero tipo sarebbe costoso) –