|
5 / 5 / 0
Регистрация: 24.08.2011
Сообщений: 191
|
|||||||||||||||||
Variadic templates, якобы provided 0 argumnets17.12.2015, 06:49. Показов 1350. Ответов 9
Метки нет (Все метки)
Есть кто онлайн? Проблема в вариадик темплейтсах с компилятором. Не пропускает следующий код:
По сути, я точно знаю, что код выполнится правильно в рантайме. Но компилятор упорно не хочет пропускать вызов функции и пишет типа
Как этот паттерн юзать правильно, подскажите пожалуйста? Добавлено через 1 час 50 минут Хмм... Ну я добавил такой трикс вниз:
0
|
|||||||||||||||||
| 17.12.2015, 06:49 | |
|
Ответы с готовыми решениями:
9
Variadic Templates - как обращаться к аргументам variadic-функции? Variadic Templates
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||||||||||||
| 17.12.2015, 09:46 | ||||||||||||
Сообщение было отмечено Defake как решение
РешениеФундаментальную вещь не понимаешь. Все ветки if должны быть синтаксически корректны. sizeof...(args) выполняется на этапе компиляции. Но тело if должно быть вычислимо с учетом того, что написано. Т.е. ветвление будет на этапе исполнения, а на этапе компиляции все ветки if должны быть корректны. В твоем примере нет функции AddEdges c одним аргументом, поэтому он справедливо ругается. В твоем случае получается следующее:
Однако, обычно делают как-то так:
Кстати, вот некоторые предложения, которые позволили бы написать этот код в императивном стиле, как ты и хотел: http://www.open-std.org/jtc1/s... /n3329.pdf. http://www.open-std.org/jtc1/s... /n3613.pdf Но это пока на этапе рассмотрения. Добавлено через 5 минут Может быть еще интересно вот это решение: http://baptiste-wicht.com/post... 11c14.html
2
|
||||||||||||
|
5 / 5 / 0
Регистрация: 24.08.2011
Сообщений: 191
|
|
| 17.12.2015, 12:53 [ТС] | |
|
DrOffset, хм, даже если ветка никогда не выполнится (не думаю, что компилятор этого может не видеть. Не помню как в VS, а в qt точно пишет, мол ветка иф не юзается, а переменная не используется), то она всё равно должна быть корректна? Странно.
Ну и да, я просто не видел такого решения (с пустой функцией) в реализациях variadic templates. Везде приводится решение только такое, как я описал в шапке. То есть когда заканчивается набор агрументов в args..., то функция перестает вызываться. Я еще помню удивлялся этому, дескать вот какой компилятор умный, что сам догадывается, что функцию вызывать уже не надо... И я даже уверен, что сначала, когда я реализовал такой подход, у меня код скомпилировался. А вот потом что я делал.. Убей - не помню =D
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||||||
| 17.12.2015, 14:18 | |||||||||
|
Код должен быть корректен в соответствии с правилами языка. Все ветки обрабатываются транслятором, правила для которого диктуются стандартом языка. Достижимость отдельных веток может быть проверена компилятором на этом этапе, но диагностика выдается только в качестве предупреждений. Однако проверка достижимости - это не тоже самое, что отбрасывание синтаксических правил. Это обсусловлено в том числе и историческими причинами, т.к. compile-time вычисления гораздо моложе, чем яык С, от которого С++ унаследовал очень многое. Поэтому единственный разумный вариант - это введение новой конструкции (или нового контекста) специально для compile-time вычислений. Примеры выше я приводил. Обычно используют либо перегрузку, задавая терминальные состояния перегруженными функциями, либо специализацию классов/функций, - классический пример: вычисление факториала в compile-time. Либо используется принцип SFINAE (неверная подстановка не является ошибкой), однако специфичность явления не позволяет так просто распространить его на все ситуации. ![]() Добавлено через 30 минут Причем стоит понимать, что до тех пор, пока нет инстацирования шаблона, код будет компилироваться в том виде, в котором он написан в шапке. Но это общий вид, кодогенерации не будет, а компилятор обязан проверять только разрешимые в этом общем контексте ситуации. Остальные будут проверены при инстанцировании. Причем компилятор VS не делает этого, поэтому до момента инстацирования даже такой код для него будет "корректным". Кликните здесь для просмотра всего текста
Собственно, пруф. Тот же код, но другом компиляторе: CLang: http://rextester.com/MRN43530 Не по теме: Тексты с кириллицей для VS (cl) на сайте не работают из-за UTF-8, в VS с кодировкой cp1251 для исходника будет жить и код из спойлера.
2
|
|||||||||
|
5 / 5 / 0
Регистрация: 24.08.2011
Сообщений: 191
|
|||||||||
| 17.12.2015, 19:54 [ТС] | |||||||||
В тех примерах было примерно так:
В общем, тема, думаю, себя исчерпала, а я уже пустился в лирический оффтоп. Буду теперь юзать этакие "заглушки", прочитаю про статик ифы. В общем, спасибо =)
0
|
|||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 17.12.2015, 20:17 | ||
|
Не по теме: реально, static if хотят узаконить?!
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 17.12.2015, 20:58 | ||
|
И if`а тут нет, о чем и говорилось. ![]() Ладно, я думаю теперь все понятно. Добавлено через 34 секунды
0
|
||
| 17.12.2015, 21:06 | |
|
0
|
|
| 17.12.2015, 21:34 | |
|
0
|
|
| 17.12.2015, 21:34 | |
|
Помогаю со студенческими работами здесь
10
Variadic templates
Variadic templates
Variadic templates fail Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|