读书人

关于非部类模版形参数组为什么要以

发布时间: 2013-07-16 22:38:05 作者: rapoo

关于非类型模版形参——数组为什么要以引用传值
函数里并没有改变数组里的值,为什么一定要用引用?
代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

template <class T, size_t N>
size_t size( T (&arr)[N] ) // 为什么要用引用
{
return N;
}

template <class T, size_t N>
void printValues( const T (&arr)[N] ) // 为什么要用引用
{
for ( size_t i = 0; i != N; ++i )
{
cout << arr[ i ] << endl;
}
}

int main()
{
int a[] = { 1, 2, 3, 4 };
int length = size( a );
printValues( a );

return 0;
}
非类型模版形参 数组
[解决办法]
直接传数组的话, 数组名会退化成指针.
[解决办法]
无规定一定要用引用,用指向数组的指针一样可以,如下所示,只不过用引用可以在函数内部获得简洁清晰的语法结构:


template< typename T, size_t N >
void fun( T ( *p )[N] )
{
std::cout << ( *p )[1] << std::endl;
}

int main()
{
int a[ 10 ] = { 100, 200, 300 };
double b[ ] = { 50.24, 60.32, 70.99 };
fun( &a );
fun( &b );
return 0;
}

[解决办法]
数组传引用能避免数组退化为指针,可以保留数组的长度信息
[解决办法]
因为模板参数 已经有数组的大小信息了,size_t N,这个N不是变量,是常量。
每次使用这个模板,都是用N个都是一个定值,也许只是为了模板匹配更好而已;
这个模板的代码膨胀的速度是惊人的;

[解决办法]
这就是指针与引用的区别:引用由指针的高效,但是没有指针的“拖沓”(比如,&, ->, *)



这里完全可以用指针。
[解决办法]

引用:
Quote: 引用:

无规定一定要用引用:
因为模板参数 已经有数组的大小信息了,size_t N,这个N不是变量,是常量。
每次使用这个模板,都是用N个都是一个定值,也许只是为了模板匹配更好而已;
这个模板的代码膨胀的速度是惊人的;
别随便就冒出“这个模板的代码膨胀的速度是惊人的”这句话来行么,分清场合
你有几个不同类型(类型里包括长度信息)就有几个模板函数
实际上你的代码里一共能有几个数组?几百个?几千个?有人这样写代码的吗?
真有这么大规模的代码量,还会在乎这一个小模板?
[解决办法]
与模板无关吧,T (&arr)[N],可以保存数组长度信息
[解决办法]
  void f(int arr[10]);
int arr[5];
f(arr); // 编译是能通过的。

void f(int (&arr)[10]);
int arr[5];
f(arr); // 编译器会报错。

读书人网 >C++

热点推荐