The function template is named ArraySizeHelper
, for a function that takes one argument, a reference to a T [N]
, and returns a reference to a char [N]
.
The macro passes your object (let's say it's X obj[M]
) as the argument. The compiler infers that T == X
and N == M
. So it declares a function with a return type of char (&)[M]
. The macro then wraps this return value with sizeof
, so it's really doing sizeof(char [M])
, which is M
.
If you give it a non-array type (e.g. a T *
), 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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…