Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用模板函数计算数组中的元素数_C++_Arrays_Templates - Fatal编程技术网

C++ 使用模板函数计算数组中的元素数

C++ 使用模板函数计算数组中的元素数,c++,arrays,templates,C++,Arrays,Templates,我正在寻找一种方法来生成一个模板函数,该函数计算数组中的元素数量,而不传递整个数组,只传递一个指向它的指针。所以我想到了这个: template <typename T> long int calculateElements(T* someArray) { return (sizeof(T) / sizeof(&someArray)); }; 模板 长整数计算元素(T*someArray){ 返回(sizeof(T)/sizeof(&someArray)); };

我正在寻找一种方法来生成一个模板函数,该函数计算数组中的元素数量,而不传递整个数组,只传递一个指向它的指针。所以我想到了这个:

template <typename T>
long int calculateElements(T* someArray) {
    return (sizeof(T) / sizeof(&someArray));
};
模板
长整数计算元素(T*someArray){
返回(sizeof(T)/sizeof(&someArray));
};
现在,我的感觉告诉我,这不应该起作用,但它确实起作用了

假设我有一个10个整数的数组
T
将是一个
int
,因此
sizeof(T)
将是
4
someArray
将是指向int数组的指针,因此
sizeof(&someArray)
将是整数的10倍(
10*sizeof(T)
),即
40
。函数应该返回0,但它不返回

谁能解释一下我做错了什么


谢谢。

它可能与阵列相关:

template <typename T, std::size_t N>
constexpr std::size_t calculateElements(const T (&)[N])
{
    return N;
}
模板
constexpr std::大小计算元素(const t(&)[N])
{
返回N;
}


当前返回的
sizeof(T)/sizeof(T**)
是元素的大小除以指针的大小(32位上为4,64位上为8)。

它可能与数组有关:

template <typename T, std::size_t N>
constexpr std::size_t calculateElements(const T (&)[N])
{
    return N;
}
模板
constexpr std::大小计算元素(const t(&)[N])
{
返回N;
}


当前返回的
sizeof(T)/sizeof(T**)
是元素大小除以指针大小(32位4,64位8)。

我建议您使用C++11并阅读
std::array
。它的工作原理和普通C++表一样,但它有一些容器接口方法。您可能会感兴趣
std::array::size()

我建议您使用C++11并阅读有关
std::array
的内容。它的工作原理和普通C++表一样,但它有一些容器接口方法。也许你会感兴趣,你的感觉是对的。它不应该起作用,而且也不起作用。代码的行为不像描述的那样。将指针传递到数组将涉及数组衰减问题。您的感觉是正确的。它不应该起作用,而且也不起作用。代码的行为不像描述的那样。将指针传递到数组将涉及数组衰减问题。太好了!但是OP必须知道T(&)[N]只能用于固定大小的数组,而不能用于动态数组(指针)或数组参数。@Christophe这是一个数组参数。我想你指的是大小不确定的数组,即括号之间没有任何内容的
T[]
。由于函数参数衰减规则,数组类型的不确定大小的参数是指针。@potatosatter这正是我想要指出的!!这个解决方案很好,因为与容易出错的sizeof()方法不同,这个方法在与指针一起使用时会产生编译错误。太好了!但是OP必须知道T(&)[N]只能用于固定大小的数组,而不能用于动态数组(指针)或数组参数。@Christophe这是一个数组参数。我想你指的是大小不确定的数组,即括号之间没有任何内容的
T[]
。由于函数参数衰减规则,数组类型的不确定大小的参数是指针。@potatosatter这正是我想要指出的!!这个解决方案很好,因为与容易出错的sizeof()方法不同,这个方法在与指针一起使用时会产生编译错误。+1因为使用sizeof()计算数组元素数的技巧只适用于固定大小的数组(在编译时已知),而不适用于作为参数传递的数组。+1因为使用sizeof()计算数组元素数的技巧()若要计算数组的元素数,请仅对固定大小的数组(在编译时已知)执行操作,而不对作为参数传递的数组执行操作。