如何对 std::tuple 中的每个元素应用 constexpr 函数?
How to apply a constexpr function over every element in a 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));
}
}
但是没用。看了才知道为什么我不能这样做。有没有其他方法可以在编译时完全完成我想要的?
您不能使用常规 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));
});
}
我有一个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));
}
}
但是没用。看了
您不能使用常规 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));
});
}