Ide*_*one 8 c++ arrays size templates
// sizeofarray.cpp
#include <iostream>
template <typename T,int N>
int size(T (&Array)[N])
{
return N;
}
int main()
{
char p[]="Je suis trop bon, et vous?";
char q[size(p)]; // (A)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我听说C++中的数组大小必须是一个常量表达式.所以char q[size(p)]无效,我是对的吗?但是当我尝试时,我没有错误
g++ -Wall sizeofarray.cpp
Run Code Online (Sandbox Code Playgroud)
为什么?
就像Prasoon说的那样,这不是一个持续的表达.现在,您可以获得数组大小的常量表达式值,如下所示:
template <std::size_t N>
struct type_of_size
{
typedef char type[N];
};
template <typename T, std::size_t Size>
typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]);
#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))
Run Code Online (Sandbox Code Playgroud)
这里解释.你基本上编码数组类型的大小尺寸,然后得到sizeof那个类型的,给你:
char q[sizeof_array(p)];
Run Code Online (Sandbox Code Playgroud)
我听说C++中的数组大小必须是常量表达式。
正确的
所以 char q[size(p)] 无效,对吗?
根据 ISO C++,是的!
但当我尝试时没有出现任何错误
g++ -Wall sizeofarray.cpp
这是因为 g++ 支持 VLA(可变长度数组)作为扩展。
在C++0x那里有constexpr一个功能可以帮助您编写
constexpr int size(T (&Array)[N])
{
return N;
}
Run Code Online (Sandbox Code Playgroud)
然后char q[size(p)]就合法了。
编辑:另请阅读这篇文章[博客无论如何]