Должен ли я специализироваться или перегрузить? - PullRequest
2 голосов
/ 04 августа 2011

Предположим, у меня есть шаблон функции:

template <typename T>
std::string foo(const T& x)
{
    return some_computation_involving(x);
}

Если x уже является строкой, я просто хочу передать ее дословно.Должен ли я специализировать шаблон функции?

template <>
std::string foo(const std::string& x)
{
    return x;
}

Или я должен предоставить функцию без шаблона?

std::string foo(const std::string& x)
{
    return x;
}

При каких обстоятельствах я должен выбрать, какой вариант и какие подводные камни янужно знать?

Ответы [ 2 ]

5 голосов
/ 04 августа 2011

Предпочитают перегрузку специализации функций, говорит Херб Саттер .Он объясняет это в своих статьях:

3 голосов
/ 04 августа 2011

Всегда выбирайте перегрузку, если можете. Функция шаблона специализации - переменчивая сука. Например, при принятии решения о специализации не учитываются неявные преобразования, включая ковариацию.

Изменить: Например, если вы делаете что-то вроде,

template<typename T> void func(T t);
template<> void func(base*);

int main() {
    func(new derived);
}

Специализация не называется. Если бы это была перегрузка, она была бы вызвана.

...