Свернутые выражения в C++11 и C++14: идиоматический подход?
Принятый ответ на расширение пакета шаблонов Variadic вопросов и ответов использует распространенный подход до C++17 (до свертывания выражений) для «свертывания» нерасширенного пакета параметров шаблона.
Я видел несколько разных вариантов этой техники; взяв в качестве примера приведенные выше вопросы и ответы:
#include #include #include шаблон static void bar(T) {} шаблон static void foo1(Args &&... args) { используя расширитель = int[]; // Крайний левый void, чтобы избежать `результата выражения неиспользованного [-Wunused-value]` (void)expander{0, ((void)bar(std::forward(args)), 0)...}; } шаблон static void foo2(Args &&... args) { int dummy[] = {0, ((void)bar(std::forward(args)), 0)...}; // Чтобы избежать `неиспользуемой переменной 'dummy' [-Wunused-variable]` (пустота)манекен; } шаблон static void foo3(Args &&... args) { // Крайний левый void, чтобы избежать `результата выражения неиспользованного [-Wunused-value]` (void)std::initializer_list{((void)bar(std::forward(args)), 0)...}; } шаблон static void foo4(Args &&... args) { auto l = {0, ((void)bar(std::forward(args)), 0)...}; // Чтобы избежать `неиспользуемой переменной 'l' [-Wunused-variable]` (пустота)л; } интервал основной() { foo1(1, 2, 3, "3"); Фу1(); foo2(1, 2, 3, "3"); Фу2(); foo3(1, 2, 3, "3"); Фу3(); foo4(1, 2, 3, "3"); Фу4(); вернуть 0; } Считаются ли какие-либо из этих вариантов (или других вариантов) «идиоматическими»? Есть ли между ними какие-то тонкости/различия, на которые стоит обратить внимание?
Подход std::initializer_list не требует несколько неуловимого левого 0 в braced-init-list, поскольку список инициализаторов может быть пустым, тогда как массив не может иметь нулевой (/отрицательный) размер. Возможно, это может быть аргументом в пользу foo3 (возможно, немного меньшая сложность за счет дополнительного #include).
Какие из этих методов имитации выражений свертки до C++17 считаются идиоматическими? ⇐ C++
Программы на C++. Форум разработчиков
1695649718
Гость
Свернутые выражения в C++11 и C++14: идиоматический подход?
Принятый ответ на расширение пакета шаблонов Variadic вопросов и ответов использует распространенный подход до C++17 (до свертывания выражений) для «свертывания» нерасширенного пакета параметров шаблона.
Я видел несколько разных вариантов этой техники; взяв в качестве примера приведенные выше вопросы и ответы:
#include #include #include шаблон static void bar(T) {} шаблон static void foo1(Args &&... args) { используя расширитель = int[]; // Крайний левый void, чтобы избежать `результата выражения неиспользованного [-Wunused-value]` (void)expander{0, ((void)bar(std::forward(args)), 0)...}; } шаблон static void foo2(Args &&... args) { int dummy[] = {0, ((void)bar(std::forward(args)), 0)...}; // Чтобы избежать `неиспользуемой переменной 'dummy' [-Wunused-variable]` (пустота)манекен; } шаблон static void foo3(Args &&... args) { // Крайний левый void, чтобы избежать `результата выражения неиспользованного [-Wunused-value]` (void)std::initializer_list{((void)bar(std::forward(args)), 0)...}; } шаблон static void foo4(Args &&... args) { auto l = {0, ((void)bar(std::forward(args)), 0)...}; // Чтобы избежать `неиспользуемой переменной 'l' [-Wunused-variable]` (пустота)л; } интервал основной() { foo1(1, 2, 3, "3"); Фу1(); foo2(1, 2, 3, "3"); Фу2(); foo3(1, 2, 3, "3"); Фу3(); foo4(1, 2, 3, "3"); Фу4(); вернуть 0; } Считаются ли какие-либо из этих вариантов (или других вариантов) «идиоматическими»? Есть ли между ними какие-то тонкости/различия, на которые стоит обратить внимание?
Подход std::initializer_list не требует несколько неуловимого левого 0 в braced-init-list, поскольку список инициализаторов может быть пустым, тогда как массив не может иметь нулевой (/отрицательный) размер. Возможно, это может быть аргументом в пользу foo3 (возможно, немного меньшая сложность за счет дополнительного #include).
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия