Согласно этой статье от Херба Саттера, всегда следует выбирать Класс, специализирующийся более Перегрузка функции и определенно более Специализированные шаблоны функций,
Причина в том, что
- Специализации не перегружаются. Разрешение перегрузки выбирает только базовый шаблон (или нетекстовую функцию, если она доступна). Только после того, как будет решено, какой базовый шаблон будет выбран, и этот выбор заблокирован, компилятор оглянется, чтобы узнать, есть ли подходящая специализация этого шаблона, и если так, то эта специализация будет использоваться.
- мы не можем специализировать шаблоны функций.
Я должен признать, что прежде чем читать статью, я несколько раз ударил головой об стену. Почему он не выбирает мою специальную функцию ...
После прочтения статьи я больше никогда не использовал шаблоны специализированных функций.
Пример:
template <class T> void foo( T t);
Мы должны написать foo вот так, чтобы мы могли специализировать его на шаблонах классов, а не на специализации функций.
template<class T>
struct FooImpl;
template <class T> void foo( T t) {
FooImpl<T>::foo(t);
}
Теперь мы можем специализировать шаблон и нам не нужно беспокоиться о правилах перегрузки, и мы можем даже частично специализировать шаблон следующим образом:
template<class U, class V>
struct FooImpl< QMap< U, V > >;
Вот вопрос.
Кажется, что члены StackOverflow предпочитают специализированные шаблоны функций?
Почему?
Потому что шаблоны специализированных функций получают гораздо больше голосов, чем решения по перегрузке и специализация класса.
С информацией, которая у меня есть в данный момент, я нахожу ее извращенной, потому что я знаю, что могу сделать это правильно, но я знаю, что тот, кто придет за мной, ударит по стене.
Уже есть несколько ссылок на статью GOTWCA, поэтому вы, должно быть, прочитали статью. Это означает, что инициаторы должны иметь дополнительную информацию, встаньте и просветите меня.