c++ - 如何解压未知大小的元组?
问题描述
鉴于,
template<typename T>
void foo(T t)
{
std::tie(/*xxx*/)=t;
auto &[/*yyy*/]=t;
}
int main()
{
foo(forward_as_tuple(1,2,3));
foo(forward_as_tuple(1,2,3,4,5));
}
我想foo()
解压缩传递给自身的元组。auto
可以使用or的分解声明来std::tie()
处理未知的元组大小,例如 xxx - yyy 吗?
如果是,如何?
我正在尝试另一种方式,也许所有元素都可以被推回该类型的向量,一旦它们得到。
std::vector<T> bar;
size_t baz=std::tuple_size<T>::value; //useless because it can't be used as:
for(int i=0; i<baz; i++)
bar.push_back(std::get<i>(t)); //since i isn't constant
使用向量只是一个失败的坏主意。
还能怎么做?
我很快就会尝试的是;我想在 for 循环中获取元组元素。这就是为什么我认为我需要以某种方式提取它们。
解决方案
我很快就会尝试的是;我想在 for 循环中获取元组元素。
您无需解压缩元组即可对其进行迭代。这是我的做法:
template <typename Integer, Integer ...I, typename F>
constexpr void constexpr_for_each(std::integer_sequence<Integer, I...>, F &&func)
{
(func(std::integral_constant<Integer, I>{}) , ...);
}
template <auto N, typename F>
constexpr void constexpr_for(F &&func)
{
if constexpr (N > 0)
{
constexpr_for_each(std::make_integer_sequence<decltype(N), N>{}, std::forward<F>(func));
}
}
template <typename T>
void foo(T t)
{
constexpr_for<std::tuple_size_v<T>>([&](auto index)
{
constexpr auto i = index.value;
std::cout << std::get<i>(t) << '\n';
});
}