2012-01-17 1 views
1

У меня есть шаблон функцииЕсть ли способ, чтобы создать функцию специализацию шаблона для станда :: массива

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

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

+3

¤ Технически, что вы после этого - перегрузка. Он просто выглядит как 'template void output (std :: array const & a) {blah}'. Вы могли бы сделать его гораздо более общим, вместо этого предложив версию с двумя итераторами, возможно, в комплекте с одной штукой. Cheers & hth., –

+1

Вы действительно хотели написать 'T &', чтобы функция не вызывалась с помощью 'T const' или rvalue, или это должно быть' T const & '? –

+0

@Alf: что заставляет вас думать, что шаблон, записанный, не может быть создан с использованием типа const, как 'T'? Вывод аргумента из rvalue вызывает проблемы здесь, вам нужно написать 'foo (1);', но вывод аргумента из 'T const' не имеет значения:' const int i = 1; Foo (я); '. –

ответ

2

Вы не можете специализировать его для всех массивов, для чего потребуется «частичная специализация» шаблона. Полная специализация шаблона связывает значения всех параметров шаблона (в этом случае имеется только один, 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
template<class T, unsigned N> 
void output(std::array<T,N>& value){ 
} 

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

+0

'class N' <- Это опечатка, я думаю? –

+0

Я думаю, было бы неплохо добавить 'const'. –

+3

@Alf: Я просто пишу в соответствии с кодом в OP. :) – Xeo

1

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

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.

+0

Как @Alf говорит, технически это перегрузка.Вот почему вы не можете сделать это в 'namespace std'. –

+0

@ R.MartinhoFernandes: Спасибо, отметил :) –