#cpp #функции #шаблоны_с++
Есть шаблонная функция, принимающая аргумент произвольного типа. Хочется сделать специализацию этой функции для строк, но при этом строку передавать не по значению, а по const reference. Например: #includetemplate 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); } В данном примере, к сожалению, специализация не работает. Всегда вызывается неспециализированная функция. Подскажите, пожалуйста, как лучше сделать такую специализацию или перегрузку?
Ответы
Ответ 1
Правила дедукции шаблонных аргументов в обоих вызовах f дедуцируют T == std::string. Поэтому ваша специализация просто не подходит под дедуцированное значение T, т.е. будет использоваться "главный" шаблон. Если вы хотите "поймать" эти вызовы в специализации шаблона, то специализировать его придется для std::string, а не для const std::string &. Перенаправить такие вызовы в вашу нынешнюю специализированную версию можно только "вручную", т.е. явным указанием шаблонного аргумента f(str); А если вы сделаете именно перегрузку нешаблонной функцией для const std::string &, а не специализацию шаблона, то вызываться будет в обоих случаях именно перегруженная функция void f(const std::string& param) { std::cout << "const std::string&" << std::endl; } Ответ 2
Можете просто в аргумент шаблона передать ссыльку, т.е. templatevoid f(T& param) { std::cout << "General" << std::endl; } Остальную часть оставлять как есть
Комментариев нет:
Отправить комментарий