有人可以使用递归模板解释整数序列生成吗?

时间:2017-09-03 23:28:47

标签: c++ templates recursion

我在this answer中遇到过这段代码,我无法解释它究竟是什么,以及如何将它用作整数的编译时序列。

template <size_t ...I>
struct index_sequence {};

template <size_t N, size_t ...I>
struct make_index_sequence : public make_index_sequence<N - 1, N - 1, I...> {};

template <size_t ...I>
struct make_index_sequence<0, I...> : public index_sequence<I...> {};

之前我找到了类似的实现,即herehere,但从未知道如何理解语法。 我不理解make_index_sequence的两个模板结构定义,特别是public的部分(例如: public make_index_sequence<N - 1, N - 1, I...>)。愿有人向我解释一下吗?

这里有继承吗?递归如何工作?序列存储在哪里?

编辑:这些模板生成的整数序列的示例用法是生成用于访问std::tuple<>的索引。生成器将在编译时为元组中的每个元素生成一个索引。

1 个答案:

答案 0 :(得分:1)

  

这里有继承吗?

是:

template <size_t N, size_t ...I>
struct make_index_sequence : public make_index_sequence<N - 1, N - 1, I...> 
                        // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

struct make_index_sequence<N,...>继承struct make_index_sequence<N-1,N-1,...>

  

递归如何工作?

通过继承并提供可变参数模板参数包的另一部分。

当满足N==0的特化时,递归停止。

  

序列存储在哪里?

template <size_t ...I> struct index_sequence {};

的可变参数模板参数包中