Решением, как часто, является факторизация общего поведения и предоставление средства для специализации некоторых частей алгоритма (см. Шаблон Шаблонный метод ).
Здесь вы можете сделать это довольно легко, переместив последние строки вашей функции в собственную функцию, которая может быть специализирована для определенных типов данных. Помните, что когда дело доходит до функций, перегрузка должна быть предпочтительнее специализации шаблона .
template <class T>
void xyz(T * a)
{
//few lines are common for all types for data
xyz_finish(a);
}
template <class T>
void xyz_finish(T * a)
{
// default case (can be empty)
}
void xyz_finish(std::string * s)
{
// string case
}
Конечно, ваша функция должна иметь более описательное имя, чем та, которую я использовал ...
Вы также можете выполнить симметричную операцию: переместить обычное поведение в функцию и перегрузить функцию «верхнего уровня»:
template <class T>
void xyz(T * a)
{
common_behavior(a);
}
void xyz(std::string * s)
{
common_behavior(s);
// code specific to strings
}
template <class T>
void common_behavior(T * a)
{
//few lines that are common for all types for data
}
Если вы не хотите или не можете создавать другие функции, вы можете проверить тип параметра:
template <class T>
void xyz(T * a)
{
// common code
if (is_same<T, std::string>::value)
{
//code for strings
}
}
is_same
- это шаблон класса, содержащий значение, которое имеет значение true, если два его параметра имеют одинаковый тип, доступно в TR1, Boost и C ++ 0x. Это решение будет работать, только если код в предложении if
действителен для всех типов данных, с которыми вы создаете экземпляр шаблона. Например, если вы используете функцию-член string
в блоке if
, компиляция завершится неудачно при создании экземпляра функции с другими типами данных, поскольку вы не можете вызвать метод для примитивного типа.