C++ 模板:判断是否为数组
假如:
1 | class A; |
此时,ptr 是一个指针,指向一个大小为 3 的类型 A 的数组。
如果还有一个模板,它接收一个类型 T 的指针,将这个 ptr 指针传入,可能会引发意料外的错误。
因为这个 ptr 是一个数组的指针,而不是指向数组开头第一个元素的指针,很可能因为模板内部逻辑不同而导致出现内存访问问题。
那么,如何利用模板元编程来判断一个类型是否为数组呢?
1 | // 接收一个类型 T,输出判断 value |
在上边的代码中,根据需要,建立了一个模板类,并使用 enum 类型的 value 变量输出判断。要判断是否为数组,需要和 T[N]
或者 T[]
进行匹配,即另外特化两个模板。
对于 C++ 中的实现如下:
1 | template<class T> |
在 C++ 的实现版本中,直接设置了一个模板常量表达式 is_array_v,不需要之前实现的那种版本再取 value 这个步骤,对于具体的模板匹配上和之前的类似。
这里可以再提一句有意思的:
1 | class TestA; |
结果是 true。ArrayOfTestA 是一个类型别名,他表示一个大小为 3 的 TsetA 类型的数组,传入 is_array_v 进行类型匹配时编译期会将类型别名进行展开,也就是最后使用 TestA[3]
进行匹配
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Fubuki の Donuts!