How does this Array Size Template Work?

前端 未结 3 1768
臣服心动
臣服心动 2020-12-10 02:41

I came across this snippet

template   
char (&ArraySizeHelper(T (&array)[N]))[N];  
#define arraysize(array) (sizeof(Arra         


        
3条回答
  •  南笙
    南笙 (楼主)
    2020-12-10 03:14

    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.

提交回复
热议问题