在一个循环中组合元组

时间:2018-01-29 15:33:30

标签: c++ loops tuples

是否可以通过for循环中的std :: tuple_cat组合元组,是否可以更改之前计算过的元组?

我想使用如下函数:

std::tuple<int> data;
for(int i = 0; i < max; i++)
{
     /* ... some function which changes the value of data ... */
     auto temp = std::tuple_cat(temp, data); // Add the new data to the previous tuple
}

逻辑上不可编译(在初始化之前不能使用temp)。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

遵循for循环中的逻辑,预计元组的大小会发生变化。

这是不可能的。因为元组的大小应该是编译时常量,所以不能使用相同的变量作为不同大小的元组。

答案 1 :(得分:0)

你可以做的是:

template <typename F, std::size_t ... Is>
auto tuple_generator_seq(F&& f, std::index_sequence<Is...>)
{
    const decltype(f(0u)) arr[] = {f(Is)...}; // To force order of evaluation
    return std::make_tuple(arr[Is]...);
}

template <std::size_t N, typename F>
auto tuple_generator(F&& f)
{
    return tuple_generator_seq(f, std::make_index_sequence<N>());
}

int main()
{
    auto data = 42;
    auto t = tuple_generator<5>([&](int ){ return ++data; });
    std::apply([](auto... e){ ((std::cout << e << " "), ...); }, t);
}

Demo