Есть шаблонная функция, принимающая аргумент произвольного типа. Хочется сделать специализацию этой функции для строк, но при этом строку передавать не по значению, а по const reference.
Например:
#include <iostream>
template<typename T> void f(T param)
{
std::cout << "General" << std::endl;
}
template<> void f(const std::string& param)
{
std::cout << "const std::string&" << std::endl;
}
void g(const std::string& str)
{
f(str);
}
int main()
{
std::string str;
f(str);
g(str);
}
В данном примере, к сожалению, специализация не работает. Всегда вызывается неспециализированная функция.
Подскажите, пожалуйста, как лучше сделать такую специализацию или перегрузку?
Правила дедукции шаблонных аргументов в обоих вызовах f дедуцируют T == std::string. Поэтому ваша специализация просто не подходит под дедуцированное значение T, т.е. будет использоваться "главный" шаблон. Если вы хотите "поймать" эти вызовы в специализации шаблона, то специализировать его придется для std::string, а не для const std::string &.
Перенаправить такие вызовы в вашу нынешнюю специализированную версию можно только "вручную", т.е. явным указанием шаблонного аргумента
f<const std::string &>(str);
А если вы сделаете именно перегрузку нешаблонной функцией для const std::string &, а не специализацию шаблона, то вызываться будет в обоих случаях именно перегруженная функция
void f(const std::string& param)
{
std::cout << "const std::string&" << std::endl;
}
Можете просто в аргумент шаблона передать ссыльку, т.е.
template<typename T> void f(T& param)
{
std::cout << "General" << std::endl;
}
Остальную часть оставлять как есть
Сборка персонального компьютера от Artline: умный выбор для современных пользователей