Почему вы хотели бы?
Calculator<std::string> a;
std::cout << a.add("Hello", " world") << std::endl;
Этот код выводит «Hello world». Это не оптимально (параметры std::string
в функции члена add
взяты значением), но для специализации не требуется специализация.
EDIT ОК, вы хотите специализации, но вы не можете просто специализировать функцию-член add
, потому что функция не является самим шаблоном. Вы можете специализироваться весь класс:
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 ;
}
};
Или сделайте шаблон функции в add
члена и специализироваться его:
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 ;
}
Со вторым раствором, один Calculator
экземпляр будет иметь возможность добавлять int
, std::string
или что вам нужно (так как это функция add
, которая является шаблоном, а не классом Calculator
).
@silico, @icecrime, используя STL, я могу это сделать; но я хочу использовать специализированную специализацию –
@Sujay Ghosh: Почему требуется специализация шаблона? Использование 'std :: string' намного меньше, чем создание новой специализации' Calculator '. –
Я думаю, что второе решение - лучший дизайн.Если когда-нибудь я хочу добавить пользовательский класс, а не какой-либо из PODS, это решит мою проблему. –