«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как мы можем кратко перебрать упакованный список аргументов шаблона с переменным числом вариантов?

Как мы можем кратко перебрать упакованный список аргументов шаблона с переменным числом вариантов?

Опубликовано 4 ноября 2024 г.
Просматривать:803

How Can We Iterate Over a Packed Variadic Template Argument List Concisely?

Как перебирать упакованный список аргументов шаблона с переменным числом вариантов

В C перебор упакованного списка аргументов шаблона с переменным числом аргументов представляет собой проблему из-за невозможность узнать количество аргументов и получить данные из них по отдельности. Эта проблема еще больше усугубляется использованием макроса при построении функции, который исключает рекурсивные вызовы.

Для решения этой проблемы в предлагаемом решении используется специальный тип Any, который может хранить различные типы данных. При передаче этого типа в шаблон с переменным числом аргументов аргументы расширяются в вектор любых объектов. Впоследствии отдельные элементы этого вектора можно получить с помощью специализированных функций получения (get()), что позволяет выполнять итерацию по различным типам данных.

Хотя этот метод выполняет задачу, он требует подробные вызовы функций, например foo(arg(1000)). Чтобы упростить это, мы ищем более краткий метод итерации или эквивалент std::get() для упакованных списков аргументов шаблона с переменным числом аргументов.

Решение с использованием выражений STL Fold и Lambda

Для C 17 и более поздних версий выражения свертки можно использовать вместе с лямбда-функцией для достижения итерации. Лямбда-выражение может выполнять произвольные операции внутри цикла, включая увеличение счетчика и вывод текущего аргумента:

template 
void Foo (Ts && ... inputs)
{
    int i = 0;

    ([&]
    {
        // Do things in your "loop" lambda

          i;
        std::cout << "input " << i << " = " << inputs << std::endl;

    } (), ...);
}

Этот метод обеспечивает более краткий и понятный механизм итерации.

Альтернативы для работы с разрывами цикла

Хотя вышеупомянутое решение выполняет задачу, ему не хватает возможности реализовать разрывы или возвраты внутри цикла. Чтобы решить эту проблему, мы можем использовать обходные пути, такие как:

  • Использование try/throw: В этом подходе мы можем генерировать исключения внутри лямбды, чтобы выйти из цикла. Однако этот метод может существенно повлиять на производительность из-за накладных расходов, связанных с исключениями.
  • Переключатели Variable/if: Этот подход предполагает создание переменной для управления циклом и использование операторов if для выхода из цикла. петля. Несмотря на свою эффективность, это может привести к созданию менее эстетичного кода.
Заявление о выпуске Эта статья перепечатана по адресу: 1729667291. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3