template
void array_init(T (&parm)[N])
函数的形参是指向数组的引用,这里定义了一个函数模板,是为数组而准备的.首先要认识 int (&A)[10] 这样写法的意义,是对一个10元素数组的引用.
array_init(x);
把数组名作为实参传递给函数。
------------------------
template
void array_init(T (&parm)[N])
{}
这里定义了一个函数模板,是为数组而准备的.首先要认识 int (&A)[10] 这样写法的意义,是对一个10元素数组的引用.
int A[10];
array_init(A);//相当于调用函数:array_init(int (&A)[10])
其次当你这么写程序的时候:
int B[10][20];
array_init(B); //这里发生了什么?
C++语法是很令人头痛的, 我们看 B 是什么类型? 一个[10][20]二维数组,那么模板对应的函数 :
typedef int (TYPE2B)[20] ; //加个typedef , 可能易看一点吧
void array_init(TYPE2B ( &A)[10] )
{
//这时里面的写法是个问题,很难检测出调用错误.
//但是这是可以通过编译的.多维数组与此类推
}
所以当你使用这类模板的时候,请慎重. 也是不少人建议在C++中用vector取代C中的数组,因为数组的语法确实太不易懂了,而且因为习惯,编译器也不能把数组与指针完全区分.
template
void array_init(T (&parm)[N])
{
#ifdef _DEBUG
//检测出这个T不是数组可以检测 typeid(T).name() 里面没有 [] 数组符号
if(strstr(typeid(T).name(),"[") > 0 ) //这是运行期检测,如何在编译期检测?
throw "exception in template array_init";
#endif
....
}
//另外注意一下:
int A[10] ;
int B[10] ;
B = A ; //这里发生了什么? 相当于 for(int i = 0 ; i < 10 ; ++i) B[i] = A[i] ; 吗?
void initA(int param[10]) {}
initA(A) ; //这里是怎么回事?//这时会发生传值调用吗?
void initB(int (¶m)[10]) {}
initB(A) ; //这里与initA对比一下
C中数组与指针,没有完全区分开来,C++继承了这个问题.使用数组时,就会有一些看起来怪怪的写法,如果用vector这些问题也就不存在了.
说明parm是“一个数组”的引用。
而不是一个数组。
当然匹配,可以由实参推倒出N的值。
void array_init(T (&parm)[N])//这里&parm为什么要加个();
因为&运算符的优先级比[]低,加()表示parm是个数组引用.
array_init(x);//这里的x实参与模板函数中的形参匹配吗?不匹配是怎么转换的?
只要x是数组就会匹配.
parm是对参数数组的引用,main函数中的值符合参数的条件