我在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...> {};
之前我找到了类似的实现,即here和here,但从未知道如何理解语法。
我不理解make_index_sequence
的两个模板结构定义,特别是public
的部分(例如: public make_index_sequence<N - 1, N - 1, I...>
)。愿有人向我解释一下吗?
这里有继承吗?递归如何工作?序列存储在哪里?
编辑:这些模板生成的整数序列的示例用法是生成用于访问std::tuple<>
的索引。生成器将在编译时为元组中的每个元素生成一个索引。
答案 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 {};