Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Специализация шаблонной функции для std::string

#cpp #функции #шаблоны_с++


Есть шаблонная функция, принимающая аргумент произвольного типа.
Хочется сделать специализацию этой функции для строк, но при этом строку передавать
не по значению, а по const reference.

Например:

#include 

template 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



Можете просто в аргумент шаблона передать ссыльку, т.е. template void f(T& param) { std::cout << "General" << std::endl; } Остальную часть оставлять как есть

Комментариев нет:

Отправить комментарий