(原創) 如何使用function template傳遞array? (C/C++) (template)
將array傳進function,在C/C++一直是很重要的課題,在C語言中,array傳進function的是pointer,但array size一直是大問題,除了compiler不做檢查外,可能還得另外傳array size(C#則不必);C++提出reference array和function template後,有更好的方式解決這個C語言的老問題。
reference array讓compiler除了檢查array element型別外,還可以檢查array size,但缺點是array size必須寫死,若透過function template,則array size不必寫死,可以處理任何array size。
reference array讓compiler除了檢查array element型別外,還可以檢查array size,但缺點是array size必須寫死,若透過function template,則array size不必寫死,可以處理任何array size。
1
/*
2
(C) OOMusou 2007 http://oomusou.cnblogs.com
3![](/Images/OutliningIndicators/InBlock.gif)
4
Filename : FunctionTemplate_ArrayPassToFunction.cpp
5
Compiler : Visual C++ 8.0 / ISO C++
6
Description : Demo how to use function template & reference array pass to function
7
Release : 02/09/2007 1.0
8
*/
9
#include <iostream>
10![](/Images/OutliningIndicators/None.gif)
11
using namespace std;
12![](/Images/OutliningIndicators/None.gif)
13
template <typename T, size_t N>
14
void func(T (&arr)[N]) {
15
for(size_t i = 0; i != N; ++i) {
16
cout << arr[i] << endl;
17
}
18
}
19![](/Images/OutliningIndicators/None.gif)
20
int main() {
21
int ia[] = {0 , 1, 2};
22
func(ia);
23
}
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](/Images/OutliningIndicators/InBlock.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
15
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
14行array size並沒有寫死,N是個變數,而15行也可以繼續用這個變數作counting,由於function template的typename,我們不只處理任意array size的array,還可處理任意型態的array。
C#會有這個需求嗎?不會!!因為C#的array自帶GetLength() method,可以輕鬆的得到array size,所以不需使用任何特別的技巧處理。
Conclusion
透過reference array和function template,C語言對於array和function的老問題總算得到圓滿的解答。
See Also
(原創) array可以使用reference方式傳進function嗎? (初級) (C++)
(原創) array傳進function該怎麼寫才好? (初級) (C/C++)
(原創) array傳進function該怎麼寫才好? (初級) (C#)
(原創) 如何使用boost::array? (初級) (C++) (boost)
Reference
C++ Primer 4th P.633