给定可变索引序列的元组的 C++ 子元组
C++ subtuple from tuple given variadic index sequence
假设我有一个 std::tuple
,我想编写一个函数,它接收一个元组和一个输出包含与这些索引对应的列的子元组的可变序列。
示例用例:
std::tuple<int, char, float, std::string> t{1, 'd', 3.14, "aaa"};
auto subtuple = extract_subtuple(t, 0, 2);
// returns std::tuple<int, float>(1, 3.14)
这可能吗?
我看过另一个question,但最后我没有找到我要找的东西。
你不能直接这样做,因为元组索引应该是常量表达式并且函数参数是 never constant expressions 即使相应的参数是。您有两个主要选择。
首先,您可以制作索引模板参数:
template<std::size_t... Is, class... Ts>
auto extract_subtuple(const std::tuple<Ts...>& tuple) {
return std::make_tuple(std::get<Is>(tuple)...);
}
auto subtuple = extract_subtuple<0, 1>(t);
其次,如果你想制作索引函数参数,你可以将它们包装成类型:
template<class... Ts, class... Indices>
auto extract_subtuple(const std::tuple<Ts...>& tuple, Indices...) {
return std::make_tuple(std::get<Indices::value>(tuple)...);
}
template<std::size_t I>
using Idx = std::integral_constant<std::size_t, I>;
auto subtuple = extract_subtuple(t, Idx<0>{}, Idx<1>{});
假设我有一个 std::tuple
,我想编写一个函数,它接收一个元组和一个输出包含与这些索引对应的列的子元组的可变序列。
示例用例:
std::tuple<int, char, float, std::string> t{1, 'd', 3.14, "aaa"};
auto subtuple = extract_subtuple(t, 0, 2);
// returns std::tuple<int, float>(1, 3.14)
这可能吗?
我看过另一个question,但最后我没有找到我要找的东西。
你不能直接这样做,因为元组索引应该是常量表达式并且函数参数是 never constant expressions 即使相应的参数是。您有两个主要选择。
首先,您可以制作索引模板参数:
template<std::size_t... Is, class... Ts>
auto extract_subtuple(const std::tuple<Ts...>& tuple) {
return std::make_tuple(std::get<Is>(tuple)...);
}
auto subtuple = extract_subtuple<0, 1>(t);
其次,如果你想制作索引函数参数,你可以将它们包装成类型:
template<class... Ts, class... Indices>
auto extract_subtuple(const std::tuple<Ts...>& tuple, Indices...) {
return std::make_tuple(std::get<Indices::value>(tuple)...);
}
template<std::size_t I>
using Idx = std::integral_constant<std::size_t, I>;
auto subtuple = extract_subtuple(t, Idx<0>{}, Idx<1>{});