807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

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

14.08.2017, 11:35. Показов 1239. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет, сабж ясен из заголовка
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2017, 11:35
Ответы с готовыми решениями:

Частичная специализация шаблона функции
Добрый день, помогите разобраться в чем проблема кода: template <int X, int Y> bool isSimple(){ return X%Y == 0 &&...

Частичная специализация шаблона
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть шаблон класса #include <iostream> ...

Частичная специализация шаблона
Может кто объяснить частичную специализацию и принцип её работы? По этой теме мало информации, а та что есть я не понял. С обычной...

15
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
14.08.2017, 11:37
никаким, частичная специализация для функций не поддерживается.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.08.2017, 11:53  [ТС]
GbaLog-, почему тогда такое робит? вроде же частичная
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
#include <iostream>
using namespace std;
 
template <typename T, typename U>
void fn(T const& t, U const&)
{
    std::cout << __PRETTY_FUNCTION__ << "\n";
    cout << &t << ' ' << t << endl;
}
 
template <typename U>
void fn(char const* const& t, U const&)
{
    std::cout << __PRETTY_FUNCTION__ << "\n";
    cout << static_cast<void const*>(t) << ' ' << t << endl;
}
 
int main()
{
    char const* ptr = "xxx";
    int i{};
 
    fn(i, nullptr);
    cout << endl;
    fn(ptr, nullptr);
 
    system("pause");
}
0
18 / 17 / 16
Регистрация: 04.07.2017
Сообщений: 36
14.08.2017, 12:23
Ferrari F1, это обычное объявление функции. Функции же перегружаются, и в итоге после компиляции это будут две разные функции. А класс используется как представление данных на компиляции; поэтому, при использовании шаблонного класса, применяется спецификация template<>class A<int>, чтобы показать, что это не переопределение, а спецификация.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
14.08.2017, 13:35
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
вроде же частичная
Это перегрузка. Частичная специализация, если бы была возможной, записывалась бы так:
C++
1
2
3
4
5
6
7
8
9
template <typename T, typename U>
void fn(T const& t, U const&);
 
template <typename U>
void fn<char const *, U>(char const* const& t, U const&)
{
    std::cout << __PRETTY_FUNCTION__ << "\n";
    cout << static_cast<void const*>(t) << ' ' << t << endl;
}
Например clang распознает в этом коде частичную специализацию и выдает соответствующу ошибку
error: function template partial specialization is not allowed
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.08.2017, 14:18
Никаким.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.08.2017, 14:36  [ТС]
MrGluck, допускать возможность создания частичной специализации ф-ции не имеет никакого смысла, раз такой возможности нет?

Добавлено через 5 минут
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Частичная специализация, если бы была возможной, записывалась бы так:
аа, т.е. всякая частичная специализация должна сопровождаться явными параметрами типа основного шаблона?

я то думал, перегрузки быть не должно, т.к. параметры шаблона определяются в ходе дедукции арг-ов:
C++
1
2
3
4
5
6
template <typename U>
void fn(char const* const& t, U const&)
{
    std::cout << __PRETTY_FUNCTION__ << "\n";
    cout << static_cast<void const*>(t) << ' ' << t << endl;
}
что могло бы быть равносильно fn<char const *, U>
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.08.2017, 15:00  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
template <typename U>
void fn(char const* const& t, U const&)
{
    std::cout << __PRETTY_FUNCTION__ << "\n";
    cout << static_cast<void const*>(t) << ' ' << t << endl;
}
 
//...
 
char const* ptr = "xxx";
fn(ptr, 0);
при моем коде генерица инстанс fn<int>(char const* const& t, int const&) ?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.08.2017, 15:20  [ТС]
допускать возможность создания частичной специализации ф-ции не имеет никакого смысла,
раз такой возможности нет до сих пор?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.08.2017, 15:26  [ТС]
kholuyitipun, мне не нужно задавать вопросы (пускай и риторические),
мне нужен был просто ответ да или нет =) так будет проще
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.08.2017, 15:52  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
2
template <typename T, typename U>
void fn(T const& t, U const&);
Определение вышеобъявленного шаблона может быть расположено позже, но обязательно в том же файле исх. кода?

Добавлено через 46 секунд
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
в том же файле исх. кода?
или правильнее сказать в том же модуле трансляции?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
14.08.2017, 18:03
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Определение вышеобъявленного шаблона может быть расположено позже, но обязательно в том же файле исх. кода?
Не понял вопроса.
Если у тебя перегрузка, то без разницы, эти шаблоны никак не связаны.
Если мы говорим про гипотетическую частичную специализацию, то да, основной шаблон должен быть прежде, чем специализация - иначе что мы специализируем?

Добавлено через 1 минуту
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
допускать возможность создания частичной специализации ф-ции не имеет никакого смысла,
раз такой возможности нет до сих пор?
Смысла нет, потому что есть перегрузка.
Есть негласное правило - перегрузка функциям, специализация - классам. Поэтому даже допустимую полную специализацию к функциям без крайней необходимости лучше не применять.

Добавлено через 1 минуту
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
при моем коде генерица инстанс fn<int>(char const* const& t, int const&) ?
Да.
1
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.08.2017, 18:39  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Не понял вопроса.
Это был скорее вопрос, не относящийся к теме) Спросил ни с того ни с сего)
Надеюсь, не обижаетесь на меня за это?

Добавлено через 9 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
перегрузка функциям
т.е. в случае (гипотетическом) с допустимостью определения специализаций шаблонов ф-ций получалось бы нечто,
схожее по смыслу с перегрузкой ф-ций, т.е. в каком-то смысле дублирование семантики перегрузки, что для языка
являлось бы избыточным?

Добавлено через 14 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
специализация - классам
А определение частичной специализации класса имеет смысл, т.к. класс может представлять собой множество
семантически объедененных ф-ций (методов) с данными, и чтобы не перегружать каждый метод, удобнее позволить
допустить операцию частичной специализации над этим множеством как над одним целым?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
14.08.2017, 18:46
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
получалось бы нечто, схожее по смыслу с перегрузкой ф-ций, т.е. в каком-то смысле дублирование семантики перегрузки
Примерно так.
Кстати, касательно вопроса перегрузки vs специализации рекомендую почитать Саттера (новые сложные задачи, задача 7).
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
14.08.2017, 18:52  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
рекомендую почитать Саттера
спасибо) но пока не дошел до него)

Сейчас хочу дочитать Липпмана, очень хорошая книга.
Книга хороша не когда в ней много полезной инфы, а когда ее прочтение заставляет размышлять, задаваться вопросами...
вопросы примерно такого плана как сейчас у меня и возникают по ходу прочтения

Добавлено через 1 минуту
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Определение вышеобъявленного шаблона может быть расположено позже, но обязательно в том же файле исх. кода?
Цитата Сообщение от DrOffset Посмотреть сообщение
Не понял вопроса.
то я спрашивал в общем смысле, если шаблон ф-ции лишь объявлен, то какие требования налагаются на его определение?
(снова вопрос не совсем по теме)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
14.08.2017, 19:06
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
если шаблон ф-ции лишь объявлен, то какие требования налагаются на его определение?
В точке инстанцирования шаблона оно (определение) должно быть доступно.
Все определения одного и того же шаблона должны быть одинаковы.
Это в общих чертах.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
но пока не дошел до него)
У меня в свое время не было никаких проблем читать несколько книг сразу. Не вижу причин, почему у тебя они должны быть.
Форум же ты читаешь.
К книгам я тебя направляю потому, что там лучше и полнее объясняется то, о чем ты тут спрашиваешь. Программист должен уметь работать самостоятельно :)

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.08.2017, 19:06
Помогаю со студенческими работами здесь

Для чего нужна частичная специализация шаблона класса?
Доброго времени суток объясните пожалуйста зачем нужна частичная специализация шаблонов класса

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

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

Почему не создается специализация шаблона функции
Почему это не работает и как правильно определить operator&lt;&lt; вне тела класса? #include &lt;iostream&gt; using namespace std; ...

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


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

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

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru