在chromium的src/base/basictype.h中发现一段神奇的marco
template<typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array)))C++11版本 :template<typename T, size_t N>auto ArraySizeHelper(T (&array)[N]) -> char(&)[N];
解释:
The function template is namedArraySizeHelper, for a function that takes one argument, a reference to aT [N], and returns a reference to achar [N].
The macro passes your object (let's say it'sX obj[M]) as the argument. The compiler infers thatT == XandN == M. So it declares a function with a return type ofchar (&)[M]. The macro then wraps this return value withsizeof, so it's really doingsizeof(char [M]), which isM.
If you give it a non-array type (e.g. aT *), then the template parameter inference will fail.
As @Alf points out below, the advantage of this hybrid template-macro system over the alternative template-only approach is that this gives you a compile-time constant.
http://stackoverflow.com/questions/6376000/how-does-this-array-size-template-work
由 udpwork.com 聚合
|
评论: 2
|
要! 要! 即刻! Now!