Как перебирать упакованный список аргументов шаблона с переменным числом вариантов
В 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;
} (), ...);
}
Этот метод обеспечивает более краткий и понятный механизм итерации.
Альтернативы для работы с разрывами цикла
Хотя вышеупомянутое решение выполняет задачу, ему не хватает возможности реализовать разрывы или возвраты внутри цикла. Чтобы решить эту проблему, мы можем использовать обходные пути, такие как:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3