我理解這個概念,但我不知道爲什麼我需要使用非類型模板參數?爲什麼我們使用非類型模板參數?
4
A
回答
14
有許多用例,那麼讓我們來看看一對夫婦的情況下,他們是不可缺少的,其中:
固定大小的數組或matrix類,例如見C++ 11 std::array或boost::array。
一種可能實現的std::begin爲陣列,或需要一個固定的尺寸爲C風格陣列的大小,例如任何的代碼:
返回的數組的大小:
template <typename T, unsigned int N>
unsigned int size(T const (&)[N])
{
return N;
}
它們在模板元編程中也非常有用。
+0
+1在這個迴應中的每一個原因(如果我能+3它我會)。 – WhozCraig
2
在編譯時進行編程。考慮WikiPedia例如,
template <int N>
struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0> {
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
const int x = Factorial<4>::value; // == 24
const int y = Factorial<0>::value; // == 1
還有一堆的維基百科頁面上的其他例子。
編輯
正如在評論中提到的,上面的例子說明了什麼可以做而不是人們在現實項目用什麼。
2
一個真實世界的例子來自非類型模板參數與模板參數推導組合以推導數組的大小:
template <typename T, unsigned int N>
void print_array(T const (&arr)[N]) // both T and N are deduced
{
std::cout << "[";
for (unsigned int i = 0; i != N; ++i)
{
if (i != 0) { std::cout << ", ";
std::cout << arr[i];
}
std::cout << "]";
}
int main()
{
double x[] = { 1.5, -7.125, 0, std::sin(0.5) };
print_array(x);
}
0
非類型參數的另一個例子是:
template <int N>
struct A
{
// Other fields.
int data[N];
};
這裏數據字段的長度被參數化。這個結構的不同實例可以有不同的數組長度。
相關問題
- 1. 爲什麼不能模板非類型參數是類類型
- 2. 我們可以使用MemberFunction類型作爲模板參數嗎?
- 3. 非模板類型參數
- 4. 非類型模板參數
- 5. 非類型模板參數
- 6. 非類型模板參數
- 7. C++模板模板非類型參數
- 8. 爲什麼std :: future模板參數類型是引用類型?
- 9. 函數指針非類型模板參數轉換爲類型模板參數
- 10. 使用左值參考作爲非類型模板參數
- 11. 爲什麼浮點類型模板函數的模板參數類型無效?
- 12. 參考的非類型模板參數
- 13. 模板參數與類型參數與非類型參數
- 14. 泛型模板非類型參數
- 15. 爲什麼C++模板參數應該聲明爲類類型?
- 16. 使用constexpr陣列作爲模板非類型參數(C++ 14)
- 17. 使用模板類的嵌套類型作爲模板參數
- 18. 模板類與非類型模板參數成員函數
- 19. 使用非專業化的模板類型作爲模板參數
- 20. 模板:如何將非類型參數對象作爲非類型參數傳遞給另一個模板
- 21. 相依非類型模板參數
- 22. 模板非類型參數過載
- 23. 構造與非類型模板參數
- 24. typedefing非類型模板參數
- 25. 例外模板非類型參數
- 26. 推導非類型模板參數
- 27. 爲什麼我不能使用單個非類型參數內聯顯式實例化模板函數?
- 28. C++非類型模板模板參數,參考*這
- 29. C++模板專業化 - 非法類型非類型模板參數「__formal
- 30. 爲什麼在非類型參數被判偏特使用嵌套模板參數
http://en.cppreference.com/w/cpp/container/array – Mehrdad