編程時,開發人員經常需要循環和迭代。有時,需要循環遍曆跨度未知的數字範圍,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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。