Какие из этих методов имитации выражений свертки до C++17 считаются идиоматическими?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Какие из этих методов имитации выражений свертки до C++17 считаются идиоматическими?

Сообщение Гость »

Свернутые выражения в 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).
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»