Pourquoi voudriez-vous?
Calculator<std::string> a;
std::cout << a.add("Hello", " world") << std::endl;
Ce code génère "Hello world". Ce n'est pas optimal (std::string
paramètres dans la fonction membre add
sont pris par valeur), mais il ne nécessite pas de spécialisation pour fonctionner.
EDIT OK, vous voulez une spécialisation, mais vous ne pouvez pas simplement spécialiser la fonction membre add
car la fonction n'est pas le modèle lui-même. Vous pouvez spécialiser toute la classe:
template<>
class Calculator<std::string>
{
public :
Calculator() {}
~Calculator() {}
std::string add(const std::string &a, const std::string &b)
{
// Do std::string specific stuff
return a + b ;
}
};
Ou faire le modèle de fonction membre add
et spécialiser:
class Calculator
{
public :
Calculator() {}
~Calculator() {}
template<class T>
T add(T a, T b)
{
return a + b;
}
};
template<>
std::string Calculator::add<std::string>(std::string a, std::string b)
{
// Do std::string specific stuff
return a + b ;
}
Avec la deuxième solution, une seule Calculator
instance sera alors en mesure d'ajouter int
, std::string
ou tout ce dont vous avez besoin (comme c'est la fonction add
qui est le modèle, pas la classe Calculator
elle-même).
@silico, @icecrime, En utilisant STL, je peux le faire; mais je veux utiliser la spécialisation de modèle –
@Sujay Ghosh: Pourquoi la spécialisation de modèle est-elle nécessaire? Utiliser 'std :: string' est beaucoup moins de travail que de devoir créer une nouvelle spécialisation de' Calculator '. –
Je pense que la deuxième solution est une meilleure conception.Si un jour je veux ajouter une classe personnalisée, et pas n'importe lequel des PODS, cela résoudrait mon problème. –