(原創) 如何使用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
4Filename : FunctionTemplate_ArrayPassToFunction.cpp
5Compiler : Visual C++ 8.0 / ISO C++
6Description : Demo how to use function template & reference array pass to function
7Release : 02/09/2007 1.0
8*/
9#include <iostream>
10
11using namespace std;
12
13template <typename T, size_t N>
14void func(T (&arr)[N]) {
15 for(size_t i = 0; i != N; ++i) {
16 cout << arr[i] << endl;
17 }
18}
19
20int main() {
21 int ia[] = {0 , 1, 2};
22 func(ia);
23}
2(C) OOMusou 2007 http://oomusou.cnblogs.com
3
4Filename : FunctionTemplate_ArrayPassToFunction.cpp
5Compiler : Visual C++ 8.0 / ISO C++
6Description : Demo how to use function template & reference array pass to function
7Release : 02/09/2007 1.0
8*/
9#include <iostream>
10
11using namespace std;
12
13template <typename T, size_t N>
14void func(T (&arr)[N]) {
15 for(size_t i = 0; i != N; ++i) {
16 cout << arr[i] << endl;
17 }
18}
19
20int main() {
21 int ia[] = {0 , 1, 2};
22 func(ia);
23}
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