Свернутые выражения в 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++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Реализация оператора less для массивов с использованием выражений свертки
Anonymous » » в форуме C++ - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему параметры шаблона не считаются постоянными выражениями (для consteval)? [дубликат]
Anonymous » » в форуме C++ - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-