Есть ли способ получить значения в пакете параметров без использования рекурсии?
Я видел много примеров кодов, которые используют рекурсию для извлечения значений из пакета параметров. Есть ли другой способ, кроме рекурсии, извлечь значения из пакета параметров?
3 ответа
Решение
В зависимости от того, что вы хотите сделать, вы можете использовать 17-кратные выражения C++:
template <int ... ints>
constexpr int product() {
return (ints * ...);
}
Оказывается, есть обходной путь. Расширения пакета параметров C++ можно использовать как для каждого цикла:
#include <iostream>
template <int ... ints>
constexpr int product() {
int ret = 1;
auto _ = {
([&](int i) -> int {
ret *= i;
return i;
})(ints)...
};
return ret;
}
int main() {
std::cout << product<2, 6, 3>() << '\n';
return 0;
}
Проблемы следующие:
- приведенный выше код работает только для пакетов параметров шаблона без типа.
нет перерыва или продолжения
Обновить
По-видимому, разрешено иметь переход к лямбда-выражению в расширении пакета параметров. (Я не знал об этом, потому что у Clang есть ошибка, ограничивающаяgoto
операнды). Тем не менее, это не очень хорошая идея, потому что перед выходом из лямбды он не "очищается".
Вы можете переслать все параметры пакета как кортеж, а затем вызвать get<0>
:
template<class ... Args>
void foo(Args&& ... args) {
auto&& first = std::get<0>(std::forward_as_tuple(std::forward<Args>(args)...));
}