通过函数求长度的一点思考

在开发过程中我们经常需要使用到获取数组长度的函数,一般比较常用的是采用宏的方式来获取

#define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0]))

在C++中我们可以通过模板的方式来获取数组的长度

template <typename T, int N> 
int array_length(const T (&arr)[N])
{ 
    return N; 
}  

也可以使用更加简单的模板定义

template  <class T>  
int array_length(const T& p) 
{
    return sizeof(p)/sizeof(p[0]);
}

思考:

    这里为什么不能直接使用函数的方式呢?

通过代码实例可以看到,普通的函数传递数组指针后,会被退化成普通指针,从而导致返回的长度不正确。

而通过模板的方式,会被推导成原数组的引用,因此返回的长度就是原先数组的长度。

 

// 示例代码
template  <class T>  
int array_length(const T& p) 
{
    return sizeof(p)/sizeof(p[0]);
}

template <typename T, int N> 
int array_len(const T (&arr)[N])
{ 
    return N; 
} 

// 定义一个数组
int array[10] = {0};
int len = array_length(array);    // len=10
len = array_len(array);           // len = 10

 

posted @ 2013-07-30 12:30  KAME  阅读(154)  评论(0)    收藏  举报