然而,这种方法相比于使用std::index_sequence和std::make_index_sequence来说,代码更加复杂,可读性也较差。这也是为什么C++14引入了std::index_sequence和std::make_index_sequence的原因之一,它们使得编译时的元组处理变得更加简单和直观。 7. 结论 7.1 读完整篇,没发现std::index_sequence和std::make_index_sequen...
这个代码首先定义了一个travel_tuple的函数,并且利用了std::make_index_sequence将tuple类型的参数个数进行了展开,生成了0到N - 1的编译期数字。 接下来我们再利用func_call_tuple函数和展开的编译期数字,依次调用std::get<N>(tuple),并且通过lambda表达式依次的调用,完成了遍历tuple的逻辑。 std::make_index_seq...
N - 1, Ints...> {};template<std::size_t... Ints>struct make_index_sequence_helper<0, Ints...> {using type = index_sequence<Ints...>;};template<std::size_t N>using make_index_sequence
它通过我们本文的主角std::make_index_sequence来构造了一组0,1,2,3 ... N - 1的一组编译器的可变长度的整数列。(注意,这里调用std::make_index_sequence{}的构造函数没有任何意义,纯粹只是利用了它能够生成编译期整数列的能力。) const_nums函数 接着我们来看squere_num函数,这就是我们实际进行平方计算,...
接着我们来看squere_num函数,这就是我们实际进行平方计算,并生成编译期静态数组的地方了,它的实现很简单,就是依次展开通过std::make_index_sequence生成的数字,并进行平方计算,最后塞到std::array的构造函数之中进行构造。 2. How std::make_index_sequence ...
棘手的部分是 std::make_index_sequence 的实现。也就是说:棘手的部分是从 std::make_index_sequence<N> 传递到 std::index_sequence<0, 1, 2, ..., N-1>。 我向您建议一个可能的实现(不是一个很好的实现,但很简单(我希望)可以理解),我将尝试解释它是如何工作的。 Non exactly the standard index...
接着我们来看squere_num函数,这就是我们实际进行平方计算,并生成编译期静态数组的地方了,它的实现很简单,就是依次展开通过std::make_index_sequence生成的数字,并进行平方计算,最后塞到std::array的构造函数之中进行构造。 2. How std::make_index_sequence ...
首先定义sequence template<size_t...I> struct seq { using type = seq; }; 然后是concat,用以将两个sequence拆包再拼起来,因为处理目标是实现make_index_sequence<N>,所以这里和一般的concat不太一样,直接把1到N-1的计算也放进去了 template<class... I> struct concat; template<size_t L, size_t...
使用上述示例,我们可以通过调用 make_index_sequence 来生成指定长度的整数序列,并使用递归展开的方式实现整数序列的生成。 综上所述,std::index_sequence 的实现原理涉及到模板元编程和递归展开技术,通过递归展开生成整数序列,从而实现编译时整数序列的生成。
void createElements(std::vector<T>& v, std::index_sequence<Is...>) { ((void)v.emplace_back(std::get<Is>(std::make_tuple(Is))...), ...); } int main() { std::vector<std::tuple<int>> v; constexpr std::size_t numElements = 10; ...