j_r*_*ker 35
使用具有非类型模板参数的函数模板:
template <size_t N>
void func(char (&a)[N]) {
for (int i = 0; i < N; ++i) {
cout << "a[" << i << "] = " << a[i] << endl; // Or whatever you want to do
}
}
Run Code Online (Sandbox Code Playgroud)
致电:
char myArray[500]; // Or "static char myArray[500]", if you want
func(myArray);
Run Code Online (Sandbox Code Playgroud)
这个函数的新副本将针对调用它的每个不同大小的数组进行实例化,因此如果你用许多不同大小的数组调用它,你会得到一些代码膨胀.但事实并非如此.
Pau*_*xon 14
你必须将它传递给函数.您可以使用sizeof()来获取数组的大小.
const char foo[] = "foobar";
void doSomething( char *ptr, int length)
{
}
doSomething(foo, sizeof(foo));
Run Code Online (Sandbox Code Playgroud)
这个MSDN页面解释了有关sizeof的更多信息,并有一个更大的例子.
编辑:*请参阅j_random_hacker关于使用模板的有趣技术的答案 ......*
您还可以std::size()从 C++17使用
https://en.cppreference.com/w/cpp/iterator/size
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector<int> v = { 3, 1, 4 };
std::cout << std::size(v) << '\n';
int a[] = { -5, 10, 15 };
std::cout << std::size(a) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
对于 c++17 之前的复制示例实现;)
template <class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
return N;
}
Run Code Online (Sandbox Code Playgroud)