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()计算数组元素数的技巧()若要计算数组的元素数,请仅对固定大小的数组(在编译时已知)执行操作,而不对作为参数传递的数组执行操作。