我很喜欢增加可变参数模板并开始摆弄这个新功能。我试图了解 std::index_sequence
的实现细节(用于元组实现)。我在那里看到了示例代码,但我真的想要一步一步地解释 std::index_sequence
是如何编码的,以及每个阶段的元编程主体。想想 真的 傻了:)
原文由 user3613174 发布,翻译遵循 CC BY-SA 4.0 许可协议
我很喜欢增加可变参数模板并开始摆弄这个新功能。我试图了解 std::index_sequence
的实现细节(用于元组实现)。我在那里看到了示例代码,但我真的想要一步一步地解释 std::index_sequence
是如何编码的,以及每个阶段的元编程主体。想想 真的 傻了:)
原文由 user3613174 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2.1k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答542 阅读✓ 已解决
1 回答3.3k 阅读
1 回答1.1k 阅读✓ 已解决
1 回答2.2k 阅读
你问的不是很简单的解释……
嗯…
std::index_sequence
本身很简单:定义如下实质上,它是无符号整数的模板容器。
棘手的部分是
std::make_index_sequence
的实现。也就是说:棘手的部分是从std::make_index_sequence<N>
传递到std::index_sequence<0, 1, 2, ..., N-1>
。我向您建议一个可能的实现(不是一个很好的实现,但很简单(我希望)可以理解),我将尝试解释它是如何工作的。
Non exactly the standard index sequence, that pass from
std::integer_sequence
, but fixing thestd::size_t
type you can get a reasonableindexSequence
/makeIndexSequence
pair使用以下代码。我想理解它是如何工作的一个好方法是遵循一个实际的例子。
我们可以点点看到
makeIndexSequence<3>
变成index_sequenxe<0, 1, 2>
。我们有
makeIndexSequence<3>
定义为typename indexSequenceHelper<3>::type
[N
是3
indexSequenceHelper<3>
match only the general case so inherit fromindexSequenceHelper<2, 2>
[N
is3
andNext...
is empty]indexSequenceHelper<2, 2>
match only the general case so inherit fromindexSequenceHelper<1, 1, 2>
[N
is2
andNext...
is2
]indexSequenceHelper<1, 1, 2>
match only the general case so inherit fromindexSequenceHelper<0, 0, 1, 2>
[N
is1
andNext...
is1, 2
]indexSequenceHelper<0, 0, 1, 2>
match both cases (general an partial specialization) so the partial specialization is applied and definetype = indexSequence<0, 1, 2>
[Next...
is0, 1, 2
]结论:
makeIndexSequence<3>
是indexSequence<0, 1, 2>
。希望这可以帮助。
- - 编辑 - -
一些澄清:
std::index_sequence
和std::make_index_sequence
从 C++14 开始可用我的例子很简单(我希望)可以理解,但是(正如 aschepler 所指出的)有很大的限制,即线性实现;我的意思是:如果你需要
index_sequence<0, 1, ... 999>
,使用makeIndexSequence<1000>
你以递归方式实现 1000 种不同的indexSequenceHelper
;但是有一个递归限制(编译器形式编译器不同)可以小于 1000;还有其他算法会限制递归次数,但解释起来更复杂。