Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
4 / 4 / 5
Регистрация: 25.08.2016
Сообщений: 44

Частичная специализация шаблона функции

02.12.2016, 18:21. Показов 4016. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, помогите разобраться в чем проблема кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template  <int X, int Y>
bool isSimple(){
    return X%Y == 0 && isSimple<X,Y-1>();
}
 
template<int X>
bool isSimple<X,1>(){
    return true;
}
 
template <int N>
int fun(){
    return fun<N-1>() + (isSimple<N,N-1>() ? 1 : 0);
}
 
template<>
int fun<0>(){
    return 0;
}
На
C++
1
bool IsSimple<X,1>()
выдает non-type partial specialization 'isSimple<X, 1>' is not allowed
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2016, 18:21
Ответы с готовыми решениями:

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

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

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

11
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.12.2016, 18:24
Цитата Сообщение от teatralaik Посмотреть сообщение
в чем проблема кода
Для функций доступна только полная специализация, либо её отсутствие вообще.
0
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
02.12.2016, 18:25
тут с синтаксисом вроде косяк, гляньте вики, там вроде нормально описано.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
02.12.2016, 18:26
а мне припоминается что для функций нету понятия частная специализация
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.12.2016, 18:32
Александреску. "Современное проектирование на С++".
0
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
02.12.2016, 18:54
Не понимаю, зачем тут специализация. Ведь можно написать:
C++
1
2
3
4
5
6
7
8
9
template  <int X, int Y>
bool isSimple()
{
     if( Y == 1 )
     {
          return true;
     }
     return X%Y == 0 && isSimple<X, Y - 1>();
}
Такое поведение планировалось?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.12.2016, 20:18
Цитата Сообщение от cordfield Посмотреть сообщение
Не понимаю, зачем тут специализация.
Избавление от условия в 4-й строке вашего года. Результат - уменьшение ветвлений и ускорение работы программы (да, иногда даже и такая мелочь даёт большой плюс).
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
02.12.2016, 20:32
Цитата Сообщение от teatralaik Посмотреть сообщение
выдает non-type partial specialization 'isSimple<X, 1>' is not allowed
Как уже правильно было сказано, для шаблонов функций не бывает никакой "частичной специализации". Частичная специализация возможна только для шаблонов классов.

Цитата Сообщение от castaway Посмотреть сообщение
Результат - уменьшение ветвлений и ускорение работы программы
Y - константа времени компиляции, поэтому в данном случае мы получим почти что "constexpr if", который не войдет в финальный код и на скорость работы программы влиять не будет.
1
02.12.2016, 20:45

Не по теме:

TheCalligrapher, согласен. Забыл чем являются X и Y...

0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
02.12.2016, 21:10
Возможно я переборщил с примерами, но:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
template<size_t _Value, size_t _Mod = _Value / 2> struct is_simple
{
    constexpr static bool result = _Value % _Mod ? is_simple<_Value, _Mod - 1>::result : false;
};
/////////////////////////////////////////////////////////////////////////////////////////
template<size_t _Mod> struct is_simple<0, _Mod>
{
    constexpr static bool result = false;
};
/////////////////////////////////////////////////////////////////////////////////////////
template<size_t _Mod> struct is_simple<1, _Mod>
{
    constexpr static bool result = false;
};
/////////////////////////////////////////////////////////////////////////////////////////
template<size_t _Value> struct is_simple<_Value, 1>
{
    constexpr static bool result = true;
};
/////////////////////////////////////////////////////////////////////////////////////////
#define TEST(n) \
    std::cout << "N: " << n << " is " << (is_simple<n>::result ? "simple" : "not simple") << "\n"
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    //2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,
    //79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163,
    //167, 173, 179, 181, 191, 193, 197, 199 …
    std::cout << std::boolalpha;
    TEST(0);
    TEST(1);
    TEST(2);
    TEST(3);
    TEST(4);
    TEST(5);
    TEST(6);
    TEST(7);
    TEST(8);
    TEST(9);
    TEST(10);
    TEST(11);
    TEST(12);
    TEST(13);
    TEST(14);
    TEST(15);
    TEST(16);
    TEST(17);
    TEST(18);
    TEST(19);
    TEST(20);
    TEST(21);
    TEST(22);
    TEST(23);
    TEST(24);
    TEST(25);
    TEST(26);
    TEST(27);
    TEST(28);
    TEST(29);
    TEST(30);
    TEST(31);
    TEST(32);
    TEST(33);
    TEST(34);
    TEST(35);
    TEST(36);
    TEST(37);
    TEST(38);
    TEST(39);
    TEST(40);
    TEST(41);
    TEST(42);
    TEST(43);
    TEST(44);
    TEST(45);
    TEST(46);
    TEST(47);
    TEST(48);
    TEST(49);
    TEST(50);
    TEST(51);
    TEST(52);
    TEST(53);
    TEST(54);
    TEST(55);
    TEST(56);
    TEST(57);
    TEST(58);
    TEST(59);
    TEST(60);
    TEST(61);
    TEST(62);
    TEST(63);
    TEST(64);
    TEST(65);
    TEST(66);
    TEST(67);
    TEST(68);
    TEST(69);
    TEST(70);
    TEST(71);
    TEST(72);
    TEST(73);
    TEST(74);
    TEST(75);
    TEST(76);
    TEST(77);
    TEST(78);
    TEST(79);
    TEST(80);
    TEST(81);
    TEST(82);
    TEST(83);
    TEST(84);
    TEST(85);
    TEST(86);
    TEST(87);
    TEST(88);
    TEST(89);
    TEST(90);
    TEST(91);
    TEST(92);
    TEST(93);
    TEST(94);
    TEST(95);
    TEST(96);
    TEST(97);
    TEST(98);
    TEST(99);
    TEST(100);
    TEST(101);
    TEST(102);
    TEST(103);
    TEST(104);
    TEST(105);
    TEST(106);
    TEST(107);
    TEST(108);
    TEST(109);
    TEST(110);
    TEST(111);
    TEST(112);
    TEST(113);
    TEST(114);
    TEST(115);
    TEST(116);
    TEST(117);
    TEST(118);
    TEST(119);
    TEST(120);
    TEST(121);
    TEST(122);
    TEST(123);
    TEST(124);
    TEST(125);
    TEST(126);
    TEST(127);
    TEST(128);
    TEST(129);
    TEST(130);
    TEST(131);
    TEST(132);
    TEST(133);
    TEST(134);
    TEST(135);
    TEST(136);
    TEST(137);
    TEST(138);
    TEST(139);
    TEST(140);
    TEST(141);
    TEST(142);
    TEST(143);
    TEST(144);
    TEST(145);
    TEST(146);
    TEST(147);
    TEST(148);
    TEST(149);
    TEST(150);
    TEST(151);
    TEST(152);
    TEST(153);
    TEST(154);
    TEST(155);
    TEST(156);
    TEST(157);
    TEST(158);
    TEST(159);
    TEST(160);
    TEST(161);
    TEST(162);
    TEST(163);
    TEST(164);
    TEST(165);
    TEST(166);
    TEST(167);
    TEST(168);
    TEST(169);
    TEST(170);
    TEST(171);
    TEST(172);
    TEST(173);
    TEST(174);
    TEST(175);
    TEST(176);
    TEST(177);
    TEST(178);
    TEST(179);
    TEST(180);
    TEST(181);
    TEST(182);
    TEST(183);
    TEST(184);
    TEST(185);
    TEST(186);
    TEST(187);
    TEST(188);
    TEST(189);
    TEST(190);
    TEST(191);
    TEST(192);
    TEST(193);
    TEST(194);
    TEST(195);
    TEST(196);
    TEST(197);
    TEST(198);
    TEST(199);
    TEST(200);
}
0
4 / 4 / 5
Регистрация: 25.08.2016
Сообщений: 44
04.12.2016, 16:29  [ТС]
Спасибо всем ответившим, получилось вот так:
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
template  <int X, int Y>
struct isSimple
{
    static bool isSimple_() {
        return X%Y != 0 && isSimple<X, Y - 1>::isSimple_();
    }
};
 
template  <int X>
struct isSimple<X,1>
{
    static bool isSimple_() {
        return true;
    }
};
 
template <int N>
int fun() {
    return fun<N - 1>() + (isSimple<N, N - 1>::isSimple_() ? 1 : 0);
}
 
template<>
int fun<1>() {
    return 1;
}
Странное, конечно, ограничение на частичную специализацию ф-ций.

GbaLog-, не очень понял зачем нужна магия из 11 стандарта в виде constexpr, разве данное выражение не будет и так вычислено во время компиляции?

C++
1
2
3
4
5
6
7
8
9
template  <int X, int Y>
bool isSimple()
{
     if( Y == 1 )
     {
          return true;
     }
     return X%Y == 0 && isSimple<X, Y - 1>();
}
Такой варик не работает, т.к. компилятор будет выводит специализации для всех отрицательных Y вплоть до -999.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
04.12.2016, 16:36
Цитата Сообщение от teatralaik Посмотреть сообщение
не будет и так вычислено во время компиляции?
Не обязано.
И Ваш код не прокатит там,
где требуется константа времени компиляции.
Можете воспользоваться enum'ом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.12.2016, 16:36
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru