Специализация шаблонной функции для массива
От: x-code  
Дата: 03.10.14 12:20
Оценка:
Что-то я не пойму, возможно такое или нет? Код вроде есть, а в отладчике приходит в общий шаблон а не в специализацию. Или такого вообще не может быть?
// для массива
template<class T, std::size_t N>
void Foo(T const(& arr)[N])
{
   cout << "array" <<endl;
}

// общая
template<class T>
void Foo(T& val)
{
   cout << "general" <<endl;
}

// вызываем
int arr[10];
Foo(arr);
Отредактировано 03.10.2014 12:21 x-code . Предыдущая версия .
Re: Специализация шаблонной функции для массива
От: Evgeny.Panasyuk Россия  
Дата: 03.10.14 12:25
Оценка: 4 (1)
Здравствуйте, x-code, Вы писали:

XC>Что-то я не пойму, возможно такое или нет? Код вроде есть, а в отладчике приходит в общий шаблон а не в специализацию. Или такого вообще не может быть?


1. Это не специализация, а перегрузка.
2. Поиграйся с const параметра.
Re: Специализация шаблонной функции для массива
От: Jack128  
Дата: 03.10.14 12:33
Оценка:
Здравствуйте, x-code, Вы писали:

template <typename T, std::size_t N>
using Array = T[N];

template<class T, std::size_t N>
void Foo(const Array<T, N> & arr)
{
    std::cout << "array" << std::endl;
}



как без alias'а — хз.
Re[2]: Специализация шаблонной функции для массива
От: x-code  
Дата: 03.10.14 12:35
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>1. Это не специализация, а перегрузка.

EP>2. Поиграйся с const параметра.

Убрал const — помогло.
Кстати а если я добавлю вариант для массива конкретного типа — это будет специализация или перегрузка?
template<std::size_t N>
void Foo(char (& arr)[N])
{
    cout << "char array" <<endl;
}
Re: Специализация шаблонной функции для массива
От: uzhas Ниоткуда  
Дата: 03.10.14 12:47
Оценка: :)
Здравствуйте, x-code, Вы писали:

XC>Что-то я не пойму


если добавить один const, то попадает куда надо: http://ideone.com/xEmRIY
если добавить const в другое место, то тоже попадаем куда надо: http://ideone.com/1ndFqm
если убрать один const, то тоже попадает куда надо: http://ideone.com/gaHEBM
Re[3]: Специализация шаблонной функции для массива
От: watchmaker  
Дата: 03.10.14 12:48
Оценка:
Здравствуйте, x-code, Вы писали:

XC>Кстати а если я добавлю вариант для массива конкретного типа — это будет специализация или перегрузка?

XC>
template<std::size_t N>
void Foo(char (& arr)[N])

Это всё ещё перегрузка.

Специализация, это например так:
template<> 
void Foo(int (&arr)[10]) {
    ...
}
Re[3]: Специализация шаблонной функции для массива
От: Evgeny.Panasyuk Россия  
Дата: 03.10.14 12:51
Оценка: +1
Здравствуйте, x-code, Вы писали:

XC>Убрал const — помогло.

XC>Кстати а если я добавлю вариант для массива конкретного типа — это будет специализация или перегрузка?
XC>
template<std::size_t N>
XC>void Foo(char (& arr)[N])
XC>{
XC>    cout << "char array" <<endl;
XC>}


Это тоже перегрузка. Специализация выглядит вот так:
// Primary template:
template<typename T> struct Foo {};

// Partial specialization:
template<typename T> struct Foo< vector<T> > {};

// Explicit specialization:
template<> struct Foo< vector<int> > {};

Аналогично для функций, но с тем отличием что для них нет partial specialization, а только explicit. Зато есть перегрузка. А у классов наоборот — нет перегрузки.
Это разобрано в статье Саттера: http://www.gotw.ca/gotw/049.htm
Вкратце — специализация для функций используется крайне редко, обычно используется перегрузка.
(в пространстве std можно использовать только специализацию, а не перегрузку, зато спасает ADL (но это уже отдельная тема))
Отредактировано 03.10.2014 15:48 Evgeny.Panasyuk . Предыдущая версия .
Re[4]: Специализация шаблонной функции для массива
От: andyp  
Дата: 03.10.14 19:50
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Вкратце — специализация для функций используется крайне редко, обычно используется перегрузка.

EP>(в пространстве std можно использовать только специализацию, а не перегрузку, зато спасает ADL (но это уже отдельная тема))

Старую долгую дискуссию на счет специализации функций из std и специализации шаблонов функций вообще можно посмотреть здесь.
https://groups.google.com/forum/#!topic/comp.lang.c++.moderated/s5b-2tfc3IE[1-25-false]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.