编程时,开发人员经常需要循环和迭代。有时,需要循环遍历跨度未知的数字范围,std::integer 序列在这种情况下很有用。
通过使用C++14提供的std::integer_sequence,可以在编译时创建一个整数序列。程序在运行之前就知道整数的序列。有了这个工具,就可以进行模板编程,meta-programming,让编码变得不那么复杂。
当 std::integer_sequence 用作函数模板的参数时,可以推导表示元素序列的参数包 Ints 并将其用于包扩展。
用法
template <typename T, T... Ints> struct integer_sequence;
其中 struct 用于用 Ints 中给定的值定义整数序列。
模板参数
- T:它是整数的类型。
- Ints:它是一个整数参数包。
会员函数
- size():它返回由参数包 Ints 表示的元素序列中的元素数量。
std::integer_sequence 的示例
示例 1:
在下面的代码中,我们将利用上述语法来演示 C++ 14 中 std::integer_sequence 的使用。
C++
#include <iostream>
#include <utility>
using namespace std;
template <typename T, T... Is>
void print_sequence(integer_sequence<T, Is...>)
{
cout << "The sequence is: ";
((cout << Is << ' '),
...); // fold expression to print sequence
}
int main()
{
print_sequence(integer_sequence<int, 1, 2, 3, 4>{});
return 0;
}
输出
The sequence is: 1 2 3 4
解释:
在此代码中,std::integer 序列参数被传递给在此代码中定义的 print_sequence 函数。然后该函数打印其值。通过使用折叠表达式将序列打印在由空格分隔的单行上。
示例 2:
在下面的代码中,integer_sequence_size 结构体使用模板专门化来递归计算integer_sequence 的大小。
C++
#include <iostream>
#include <utility>
using namespace std;
// Struct to calculate the size of an integer_sequence
template <typename T, T... Ints>
struct integer_sequence_size;
// Partial specialization for an integer_sequence with at
// least one element
template <typename T, T Head, T... Tail>
struct integer_sequence_size<T, Head, Tail...> {
static constexpr size_t value
= 1 + integer_sequence_size<T, Tail...>::value;
};
// Specialization for an empty integer_sequence
template <typename T> struct integer_sequence_size<T> {
static constexpr size_t value = 0;
};
int main()
{
// Define an integer_sequence
using my_sequence
= integer_sequence<int, 0, 1, 2, 3, 4>;
// Print the size of the integer_sequence using the
// custom struct
std::cout
<< "Size: "
<< integer_sequence_size<int, 0, 1, 2, 3, 4>::value
<< endl;
// Output: Size: 5
return 0;
}
输出
Size: 5
在 C++ 14 中使用 std::integer_sequence 的优点是:
- 简化模板元编程:通过提供一种生成编译时整数序列的简单方法,std::integer 序列简化了 C++14 中的模板元编程。它减少了混乱和不准确的递归模板函数的必要性。
- 提高可读性:通过使用 std::integer 序列,您可以编写更简单的代码,因为它消除了对复杂模板函数调用的要求。
- 启用包扩展:Std::integer 序列允许扩展参数包,从而能够创建高效的代码。此外,它还能够处理大量模板参数。
相关用法
- C++14 std::quoted用法及代码示例
- C++14 std::make_unique用法及代码示例
- C++17 std::clamp用法及代码示例
- C++17 std::lcm用法及代码示例
- C++17 std::variant用法及代码示例
- C++11 std::initializer_list用法及代码示例
- C++11 std::move_iterator用法及代码示例
- C++17 std::cyl_bessel_i用法及代码示例
- C++ cos()用法及代码示例
- C++ sin()用法及代码示例
- C++ asin()用法及代码示例
- C++ atan()用法及代码示例
- C++ atan2()用法及代码示例
- C++ acos()用法及代码示例
- C++ tan()用法及代码示例
- C++ sinh()用法及代码示例
- C++ ceil()用法及代码示例
- C++ tanh()用法及代码示例
- C++ fmod()用法及代码示例
- C++ acosh()用法及代码示例
- C++ asinh()用法及代码示例
- C++ floor()用法及代码示例
- C++ atanh()用法及代码示例
- C++ log()用法及代码示例
- C++ trunc()用法及代码示例
注:本文由纯净天空筛选整理自krishna_97大神的英文原创作品 std::integer_sequence in C++ 14。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。