如何解压未知大小的元组?

问题描述 投票:0回答:1

给定:

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() 来解包传递给自己的元组。autostd::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循环中得到元组元素。这就是为什么我认为我需要以某种方式提取它们。

c++ c++11 tuples c++14 c++17
1个回答
4
投票

如何解压未知大小的元组?

auto &[/*yyy*/]=t;

你不能这样做。

也许所有的元素都可以被推回到一个该类型的向量上

使用 std::apply:

std::vector<int> baz;
std::apply([&baz](auto... args) {
    (baz.push_back(args), ...);
}, t);

3
投票

我想做的是,我想在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';
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.