模板展开及integer_sequence妙用

本文详细介绍了如何自定义实现C++14的integer_sequence,并通过实例展示了其在常量调用、非常量调用以及std::tuple_size调用中的应用。此外,还探讨了如何扩展integer_sequence以处理std::vector内容作为函数参数的问题,分析了利用integer_sequence在编译时动态展开参数的原理,并给出了完整实现。
摘要由CSDN通过智能技术生成

integer_sequence自实现版本

#include <iostream>
  // the type holding sequences
  template <int... Ns> 
  struct sequence {}; 
  
  // First define the template signature
  template <int... Ns> 
  struct seq_gen;
  
  // forward extend recursively
  template <int I, int... Ns> 
  struct seq_gen<I, Ns...> {
      // Take front most number of sequence,
      // decrement it, and prepend it twice.
      // First I - 1 goes into the counter,
      // Second I - 1 goes into the sequence.
      using type = typename seq_gen<I - 1, I - 1, Ns...>::type;
  };
  
  // Recursion abort
  template <int... Ns> 
  struct seq_gen<0, Ns...> {
      using type = sequence<Ns...>;
  };
  
  template <int N>
  using sequence_t = typename seq_gen<N>::type;
  
  template <int... Is> 
  void show(sequence<Is...>) {
     (((std::cout << " ") << Is), ...);                                             
  }
  
  int main() {
      show(sequence_t<10>());
  }

integer_sequence.cpp
g++ integer_sequence.cpp -o integer_sequence --std=c++17

analyze

sequence_t<10>是seq_gen<10>::type 这个类型的别名.
seq_gen<10>唯一能匹配的模板特化为:seq_gen<10, int…Ns> 。现在这个Ns是空列表{}。
这是1个模板参数变成2组模板参数质的飞跃。
我们用伪代码seq_gen<10, {}>表示seq_gen<10, {}>::type 等价于seq_gen<10-1,10-1, {}>::type即seq_gen<9,9, {}>::type
seq_gen<9,9, {}>唯一能匹配的模板特化为:seq_gen<9, int…Ns>。现在这个Ns是列表{9}。
我们用伪代码seq_gen<9, {9}>表示.
seq_gen<9, {9}>::type 等价于seq_gen<9-1,9-1, {9}>::type即seq_gen<8,8, {9}>::type
seq_gen<8,8, {9}>唯一能匹配的模板特化为:seq_gen<8, int…Ns>。现在这个Ns是列表{8,9}。
我们用伪代码seq_gen<8, {8,9}>表示.

seq_gen<0, {0,1,2,3,4,5,6,7,8,9}>唯一能匹配的模板特化为第22行,递归终结特化。
seq_ge

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值