Есть ли способ создать специализацию шаблона функции для std :: array - PullRequest
1 голос
/ 17 января 2012

У меня есть шаблон функции

template<typename T>
void output(T& value)
{
}

Есть ли способ создать специализацию для объектов вывода std :: array? Да, я знаю, что массивы разных размеров - это разные типы. ) Я просто надеюсь, что есть способ в c ++ 11

Ответы [ 3 ]

2 голосов
/ 17 января 2012

Вы не можете специализировать его для всех массивов, для которых потребуется «частичная специализация» шаблона.Полная специализация шаблона фиксирует значения всех параметров шаблона (в этом случае есть только один, T, поэтому полная специализация охватывает только один тип вместо T).Частичная специализация охватывает несколько возможных значений параметров шаблона (в данном случае мы хотим охватить любые std::array<U,N> вместо T), поэтому частичная специализация имеет собственные параметры шаблона.

C ++ разрешенийчастичная специализация шаблонов классов, но не шаблонов функций.

Вместо этого вы можете перегрузить его.Вы определяете другой шаблон функции с тем же именем и другими параметрами:

template <typename T, size_t N>
void output (const std::array<T,N> &arr); // I guess "const" by the function name
2 голосов
/ 17 января 2012
template<class T, unsigned N>
void output(std::array<T,N>& value){
}

Будет то, что вы должны использовать , так как специализация не рекомендуется. Более того, вы не можете частично специализировать шаблоны функций.

1 голос
/ 17 января 2012

Вам нужна перегрузка , а не специализация (есть только полная специализация для шаблонов функций).

template <typename T, size_t N>
void output (std::array<T,N> &arr);

Вы не можете поместить его в namespace std. И если он просто выводит данные, вы не должны передавать неконстантную ссылку.

Однако идите по пути, по которому идет стандартная библиотека, и используйте вместо этого итераторы:

template <typename Iter>
void output (Iter it, Iter end) 

Это делает вашу функцию гибкой w.r.t. тип контейнера: вероятно, ему не нужно знать, является ли это list, deque или array.

...