2010-08-03 6 views
0

J'ai un modèle de fonction comme celui-ci.Modèle de fonction

template<class T> T getFromString(const string& inStream) 
{ 
    istringstream stream (inStream); 
    T t; 

    stream >> t; 
    return t; 
} 

Je ne comprends pas comment utiliser ce modèle de fonction. J'ai essayé la méthode habituelle d'utiliser le modèle de fonction, il donnait une erreur. S'il vous plaît laissez-moi savoir pour sortir de cela.

Répondre

4

Vous pouvez l'utiliser comme ceci:

std::string a = "11"; 
int n = getFromString<int>(a); 

Cela va extraire la valeur entière de la chaîne.

BTW, il est bon d'utiliser T t = T(); à l'intérieur du modèle car il va garantir l'initialisation pour les types de données de base, même si l'extaction échoue.

1

Libérer la puissance de Boost:

int n = boost::lexical_cast<int>("11"); 
+0

alors que c'est un bon conseil, il ne fait rien pour répondre à la question. –

+0

Pas vraiment, mais vous pourriez noter que l'utilisation est exactement la même. Cependant, je crois fermement à ne pas réinventer la roue, surtout quand 'lexical_cast' est susceptible d'être beaucoup plus rapide pour les types entiers en raison d'un réglage minutieux;) –

0

Le problème est que le compilateur ne peut pas utiliser le type de retour pour en déduire les types de la fonction. Vous devez fournir explicitement le type que vous voulez dans le cadre de l'appel de la fonction, comme @Naveen déjà mentionné: getFromString<int>("123"). Une autre approche est en train de changer la signature de la fonction de sorte qu'au lieu de le renvoyer reçoit le type d'argument:

template <typename T> 
void getFromString(const std::string & str, T & value) { ... } 
int main() { 
    int x; 
    getFromString("123",x); 
} 

Comme vous fournissez une variable de type T dans l'appel, le compilateur est maintenant en mesure de déduire le type de la arguments. (x est un int, vous appelez donc getFromString<int>). L'inconvénient est que vous devez créer la variable à l'avance et le code utilisateur sera plus compliqué pour les cas d'utilisation simples comme int n = getFromString<int>("123");

Questions connexes