如何打开未知大小的元组?

鉴于

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));
}

I want foo() to unpack the tuple that's passed to itself. Can decomposition declarations with auto or std::tie(), handle the unknown tuple sizes like xxx - yyy up there?
If yes, how?

我正在尝试考虑另一种方法,一旦所有元素都可以被推回该类型的向量。

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';
        });
    }
    
  • 贪恋你温柔
    贪恋你温柔 回复
    如何打开未知大小的元组?

    你不能

    也许所有元素都可以推回该类型的向量

    Use std::apply:

    std::apply([&bar](int... args) {
        (bar.push_back(args), ...);
    }, t);