Есть ли способ получить значения в пакете параметров без использования рекурсии?

Я видел много примеров кодов, которые используют рекурсию для извлечения значений из пакета параметров. Есть ли другой способ, кроме рекурсии, извлечь значения из пакета параметров?

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)...));
}
Другие вопросы по тегам