Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Просто Саша
24 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 346
Завершенные тесты: 2
1

Специализация шаблона функции

03.12.2017, 16:07. Просмотров 272. Ответов 14
Метки нет (Все метки)

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

Возможна ли вообще написать специализацию для данного шаблона.
В принципе вопрос можно сформулировать и так: Не является ли наличие параметров значения, указываемых в угловых скобках этого шаблона функции, препятствием для создания специализации этого шаблона?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2017, 16:07
Ответы с готовыми решениями:

Специализация шаблона функции
Как сделать специализированную функцию шаблон на тип int? У меня что-то не...

Частичная специализация шаблона функции
Добрый день, помогите разобраться в чем проблема кода: template <int X, int...

Почему не создается специализация шаблона функции
Почему это не работает и как правильно определить operator<< вне тела класса? ...

Каким стандартом введена частичная специализация шаблона функции?
привет, сабж ясен из заголовка

Явная специализация шаблона функции - ошибка на этапе компиляции
Всем привет, читаю книгу С. Прата и пытаюсь скомпилировать шаблонную функцию с...

14
TRam_
зомбяк
787 / 724 / 230
Регистрация: 14.05.2017
Сообщений: 2,476
03.12.2017, 16:11 2
Как бы специализация шаблона - это и есть задание иной его реализации для конкретных типов. http://ci-plus-plus-snachala.ru/?p=3937
0
hoggy
Заблокирован
Эксперт С++
03.12.2017, 16:12 3
Цитата Сообщение от Просто Саша Посмотреть сообщение
Не является ли наличие параметров значения, указываемых в угловых скобках этого шаблона функции, препятствием для создания специализации этого шаблона?
не является.

специализируйте на здоровье
0
Просто Саша
24 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 346
Завершенные тесты: 2
03.12.2017, 17:05  [ТС] 4
Цитата Сообщение от hoggy Посмотреть сообщение
не является.
специализируйте на здоровье
Пока не выходит, вылазит сообщение об ошибке.

Добавлено через 6 минут
Пример вымученный.

Вот шаблон:

C++
1
2
3
4
5
6
7
8
9
10
template<int n, typename T> auto compare(T a, T b) -> int
{
    cout << n << endl;
    if (a > b)
        return 1;
    else if (a < b)
        return -1;
    else
        return 0;
}
Вот его специализация:

C++
1
2
3
4
5
6
7
8
9
10
template<> auto compare<int n, int *>(int * a, int * b) -> int
{
    cout << 3 * n << endl;
    if (*a > *b)
        return 1;
    else if (*a < *b)
        return -1;
    else
        return 0;
}
Пример не работает. В специализации подчеркивает n красной линией

Вот что выдает компилятор:

1>d:\myprojects\c++\deitla1\deitla1\deitla1.cpp(47): error C2146: синтаксическая ошибка: отсутствие ">" перед идентификатором "n"
1>d:\myprojects\c++\deitla1\deitla1\deitla1.cpp(48): error C2912: явная специализация; "int compare<int,int*>(int *,int *)" не является специализацией функции-шаблона
1>d:\myprojects\c++\deitla1\deitla1\deitla1.cpp(49): error C2065: n: необъявленный идентификатор

Компилятор: MS Visual C++ 2017

P.S. Когда убираю все, что связано с целочисленным параметром n из шаблона, специализации и определений, все работает прекрасно.
0
TRam_
зомбяк
787 / 724 / 230
Регистрация: 14.05.2017
Сообщений: 2,476
03.12.2017, 17:28 5
Потому что шаблоны пишутся для типов, а не для указателей. Если хочешь использовать указатели - делай для них тип-обёртку

Добавлено через 46 секунд
Либо же в самом шаблоне нужно явно указывать указатели.

Добавлено через 11 минут
Цитата Сообщение от Просто Саша Посмотреть сообщение
Когда убираю все, что связано с целочисленным параметром n из шаблона,
потому что частичная специализация шаблона функции запрещена в С++. Нужно её полностью специализировать (указывать n явно).

А вот классы можно делать с частичной специализацией.
0
Просто Саша
24 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 346
Завершенные тесты: 2
03.12.2017, 17:31  [ТС] 6
Цитата Сообщение от TRam_ Посмотреть сообщение
Потому что шаблоны пишутся для типов, а не для указателей. Если хочешь использовать указатели - делай для них тип-обёртку
Да кто же Вам такую чушь сказал.
А что указатель уже перестал быть типом?

Добавлено через 1 минуту
Цитата Сообщение от TRam_ Посмотреть сообщение
Нужно её полностью специализировать (указывать n явно).
Ну Вы покажите как это делается.

Добавлено через 1 минуту
Что значит указывать n явно?
Если n убрать оттуда, то это уже будет не специализация, а перегрузка шаблона, или я что то не догоняю.
0
TRam_
зомбяк
787 / 724 / 230
Регистрация: 14.05.2017
Сообщений: 2,476
03.12.2017, 17:34 7
Хотя... Насчёт указателей был неправ, извиняюсь.
0
Просто Саша
24 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 346
Завершенные тесты: 2
03.12.2017, 17:37  [ТС] 8
Ну напишите хотя бы одну специализацию для данного шаблона.
Я не прошу тело, напишите хотя бы ЗАГОЛОВОК.

Добавлено через 2 минуты
Или если это невозможно, то хотелось бы чтобы знающие люди написали просто, примерно следующее:
СПЕЦИАЛИЗАЦИЯ ШАБЛОНА ФУНКЦИИ, СОДЕРЖАЩЕГО ПОМИМО ТИПОВЫХ ПАРАМЕТРОВ ШАБЛОНА (С УДАРЕНИЕМ НА БУКВЕ И) ЕЩЁ И ПАРАМЕТРЫ ЗНАЧЕНИЙ НЕВОЗМОЖНА.

Так это или нет?
0
hoggy
Заблокирован
Эксперт С++
03.12.2017, 17:38 9
Цитата Сообщение от Просто Саша Посмотреть сообщение
template<> auto compare<int n, int *>(int * a, int * b) -> int
полная специализация подразумевает полную подстановку всех параметров шаблона.

например:
C++
1
template<> auto compare<10, int *>(int * a, int * b) -> int
0
Просто Саша
24 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 346
Завершенные тесты: 2
03.12.2017, 17:49  [ТС] 10
Цитата Сообщение от hoggy Посмотреть сообщение
полная специализация подразумевает полную подстановку всех параметров шаблона.
Ну а какой в ней тогда толк?
Имеется в виду для параметров значений.
0
hoggy
Заблокирован
Эксперт С++
03.12.2017, 17:52 11
Цитата Сообщение от Просто Саша Посмотреть сообщение
Ну а какой в ней тогда толк?
если в конкретном случае не видите толка - значит в этом конкретном случае,
нет нужды в полной специализации.
0
Просто Саша
24 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 346
Завершенные тесты: 2
03.12.2017, 17:57  [ТС] 12
Цитата Сообщение от hoggy Посмотреть сообщение
если в конкретном случае не видите толка - значит в этом конкретном случае,
Нет, не в конкретном случае дело, а вообще.
Если Вы знаете, что Ваша функция будет всегда вызываться с параметром 10, какой же это тогда параметр?

Добавлено через 1 минуту
Действительно я нашел в сети такое утверждение, что ЧАСТИЧНАЯ СПЕЦИАЛИЗАЦИЯ ФУНКЦИЙ В ОТЛИЧИЕ ОТ КЛАССОВ ЗАПРЕЩЕНА.

Но, хотелось уточнить следующее. Дело в том, что источники, в которых содержатся такое утверждение они 10-летней давности. Может быть что-то поменялось за это время?
0
TRam_
зомбяк
787 / 724 / 230
Регистрация: 14.05.2017
Сообщений: 2,476
03.12.2017, 18:03 13
Цитата Сообщение от Просто Саша Посмотреть сообщение
а перегрузка шаблона
в сравнении все три формы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
template<int n = 2, typename T> auto compare(T a, T b) -> int
{
    std::cout << n << std::endl;
    if (a > b)
        return 1;
    else if (a < b)
        return -1;
    else
        return 0;
}
 
template<> auto compare<2, int *>(int *a, int *b) -> int    // специализация
{
    std::cout << "2, int * " << std::endl;
    if (*a > *b)
        return 1;
    else if (*a < *b)
        return -1;
    else
        return 0;
}
 
auto compare(int *a, int *b) -> int    // перегрузка
{
    std::cout << "function" << std::endl;
    if (*a > *b)
        return 1;
    else if (*a < *b)
        return -1;
    else
        return 0;
}
Вначале будет проверяться на совпадение параметров перегрузка, потом специализация, потом шаблон.

Добавлено через 5 минут
Но зато можно определить шаблон с другим числом параметров, т.е. это не будет специализацией:

C++
1
2
3
4
5
6
7
8
9
10
template<int n> auto compare(int *a, int *b) -> int
{
    std::cout << n * 2 << std::endl;
    if (*a > *b)
        return 1;
    else if (*a < *b)
        return -1;
    else
        return 0;
}
0
Просто Саша
24 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 346
Завершенные тесты: 2
03.12.2017, 18:05  [ТС] 14
Интересует только возможность написать вот так:

Цитата Сообщение от TRam_ Посмотреть сообщение
template<> auto compare<int n, int *>(int *a, int *b) -> int
Добавлено через 1 минуту
Ну а если подытожить, то все это можно описать примерно так:

Каждая специализация шаблона должны быть согласована с исходным шаблоном по формату того, что указывается в угловых скобках. Так, например, если в исходном шаблоне, внутри угловых скобок определяется один типовый параметр, то тогда и внутри угловых скобок должен содержаться ровно один тип, а не два и не три. Кроме того, следует помнить о том, что на настоящий момент частичная специализация шаблона функции не допускается. Это означает, что при специализации шаблона функции в определении этой специализации должны указываться значения для всех параметров, которые указаны между угловыми скобками в определении шаблона. Если такой параметр является параметром значения, то для него следует указать конкретное числовое значение.

Поправьте, плиз, если ошибаюсь.
0
hoggy
Заблокирован
Эксперт С++
03.12.2017, 19:05 15
Цитата Сообщение от Просто Саша Посмотреть сообщение
а вообще.
полная специализация применяется,
когда необходимо реализовать какую то уникальную логику
для конкретного частной случая.
в подобных ситуациях нет никаких "вообще".

есть конкретные частные случаи под ключ задачи.

пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        template <class ch>
        constexpr ch* end(ch(&arr)[0]) noexcept
        {
            static_assert(
                ::is_same<char, char>::value,
                "[ERROR] length of array must be more that N > 0"
            );
        }
 
        template <class ch, size_t N>
        constexpr ch* end(ch(&arr)[N]) noexcept
        {
            return &arr[N];
        }
здесь общий случай: массив с количеством элементов N
и частный случай: массив с количеством элементов равным ноль.

Цитата Сообщение от Просто Саша Посмотреть сообщение
Может быть что-то поменялось за это время?
нет
1
03.12.2017, 19:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2017, 19:05

Error C2912: явная специализация не является специализацией функции-шаблона
Как исправить ошибку? #include &lt;iostream&gt; using namespace std; template...

специализация шаблона
Добрый день! Хотелось бы сделать шаблонную функцию, у которой будет различная...

Специализация шаблона
Пытаюсь специализировать шаблон для типа float, но не получается. В чем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru