如何使用数字索引转换 varadic std::tuple 的所有元素?
How do I transform all elements of a varadic std::tuple using numerical indices?
目前,我有一个这样的实现,以便使用接受元组每个元素的函数 bar()
转换元组的所有值。
template<typename ... Args>
void foo(const std::tuple<Args...>& a)
{
std::tuple<Args...> transformedTuple = std::make_tuple(bar(std::get<Args>(a))...);
}
问题在于,如果 Args
包含重复类型,这将不再有效。因此,我想更改 std::get<>
调用以在元组中使用数字索引而不是使用类型。鉴于我的开发环境停留在 C++14 上,有没有办法让它工作?谢谢!
您可以使用带有 std::integer_sequence
的辅助函数来执行此操作。添加一个带有 integer_sequence
like
的辅助函数
template<typename Tuple, std::size_t... I>
auto foo_helper(const Tuple& a, std::integer_sequence<std::size_t, I...>)
{
return std::make_tuple(bar(std::get<I>(a))...);
}
然后更改 foo
以调用助手
template<typename ... Args>
auto foo(const std::tuple<Args...>& a)
{
return foo_helper(a, std::make_index_sequence<sizeof...(Args)>{});
}
在 C++17 中,你可能会这样做
template<typename ... Args>
void foo(const std::tuple<Args...>& t)
{
auto transformedTuple =
std::apply([](const auto&... args){ return std::make_tuple(bar(args)...); }, t);
}
目前,我有一个这样的实现,以便使用接受元组每个元素的函数 bar()
转换元组的所有值。
template<typename ... Args>
void foo(const std::tuple<Args...>& a)
{
std::tuple<Args...> transformedTuple = std::make_tuple(bar(std::get<Args>(a))...);
}
问题在于,如果 Args
包含重复类型,这将不再有效。因此,我想更改 std::get<>
调用以在元组中使用数字索引而不是使用类型。鉴于我的开发环境停留在 C++14 上,有没有办法让它工作?谢谢!
您可以使用带有 std::integer_sequence
的辅助函数来执行此操作。添加一个带有 integer_sequence
like
template<typename Tuple, std::size_t... I>
auto foo_helper(const Tuple& a, std::integer_sequence<std::size_t, I...>)
{
return std::make_tuple(bar(std::get<I>(a))...);
}
然后更改 foo
以调用助手
template<typename ... Args>
auto foo(const std::tuple<Args...>& a)
{
return foo_helper(a, std::make_index_sequence<sizeof...(Args)>{});
}
在 C++17 中,你可能会这样做
template<typename ... Args>
void foo(const std::tuple<Args...>& t)
{
auto transformedTuple =
std::apply([](const auto&... args){ return std::make_tuple(bar(args)...); }, t);
}