我通常在C ++中使用向量,但是在特定情况下,我必须使用我不习惯的数组。如果我这样做:
// GetArraySize.cpp
#include <iostream>
#include <conio.h> // remove this line if not using Windows
int main(void)
{
int myArray[] = { 53, 87, 34, 83, 95, 28, 46 };
auto arraySize = std::end(myArray) - std::begin(myArray);
std::cout << "arraySize = " << arraySize << "\n\n";
_getch(); // remove this line if not using Windows
return(0);
}
这按预期工作(arraySize
打印为7)。但是如果我这样做:
// GetArraySizeWithFunc.cpp
#include <iostream>
#include <conio.h> // remove this line if not using Windows
// function prototypes
int getArraySize(int intArray[]);
int main(void)
{
int myArray[] = { 53, 87, 34, 83, 95, 28, 46 };
int arraySize = getArraySize(myArray);
std::cout << "arraySize = " << arraySize << "\n\n";
_getch(); // remove this line if not using Windows
return(0);
}
int getArraySize(int intArray[])
{
auto arraySize = std::end(intArray) - std::begin(intArray);
return((int)arraySize);
}
在线auto arraySize = std::end(intArray) - std::begin(intArray);
我收到错误消息:
no instance of overloaded function "std::end" matches the argument list, argument types are: (int *)
我在做什么错了?
我应该提到几件事:
-我知道使用C ++ 17可以使用std::size(myArray)
,但是在上下文中我不能使用C ++ 17
-可能有其他/更好的方法来编写getArraySize()
函数,但是我试图更好地了解如何将旧式数组传入/传出函数
答案 0 :(得分:2)
自己实施std::size
:
template <typename T, std::size_t N>
constexpr auto size(const T(&)[N]) {
return N;
}
用法:
int main() {
int arr[] = {1, 2, 3};
std::cout << "size: " << size(arr);
}
请注意,您需要将 reference 传递给数组,因为仅传递T[]
实际上会使您将T*
传递给数组的第一个元素。这样就不会保留有关数组大小的任何信息。