Как применить функцию constexpr к каждому элементу в std::tuple?

У меня есть constexpr auto my_tuple = std::make_tuple(a, b, c, d, e);. Теперь я хочу применить функцию constexpr к каждому из его элементов. Я думал, что могу сделать это так:

template <typename... Types>
void constexpr apply_func_on_tuple(std::tuple<Types...> tpl) noexcept
{
    for (std::size_t i = 0; i < sizeof...(Types); ++i)
    {
        my_function(std::get<i>(tpl));
    }
}

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


person Community    schedule 29.06.2019    source источник
comment
Я не знаю, будет ли какой-либо ответ намного лучше, чем те, что в этом вопросе кроме упоминания оператора for... C++20.   -  person chris    schedule 29.06.2019
comment
Boost::Hana::for_each работает для std::tuple boost.org/doc/libs/1_61_0/libs/hana/doc/html/ необходимо включить как заголовок for_each, так и файл . повышение/Hana/ext/std/tuple.hpp   -  person Hui    schedule 29.06.2019


Ответы (1)


Вы не можете использовать обычный цикл for, но вы можете написать функцию constexpr, которая работает точно так же, как цикл:

template <typename T, auto ...I, typename F>
constexpr void static_for_low(F &&func, std::integer_sequence<T, I...>)
{
    (void(func(std::integral_constant<T, I>{})) , ...);
}

template <auto N, typename F>
constexpr void static_for(F &&func)
{
    static_for_low(func, std::make_integer_sequence<decltype(N), N>{});
}

Затем вы можете сделать следующее:

template <typename ...Types>
constexpr void apply_func_on_tuple(std::tuple<Types...> tpl) noexcept
{
    static_for<sizeof...(Types)>([&](auto index)
    {
        my_function(std::get<index.value>(tpl));
    });
}
person HolyBlackCat    schedule 29.06.2019