4 / 4 / 5
Регистрация: 25.08.2016
Сообщений: 44

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

02.12.2016, 18:21. Показов 4079. Ответов 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
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
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 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru