这个数组大小模板是如何工作的
How does this Array Size Template Work?
我看到了这个片段
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
在本文中http://software.intel.com/en-us/articles/pvs-studio-vs-chromium/
我见过其他模板也做同样的事情,比如这个
使用模板获取数组';s大小和结束地址
我理解这些,但我在这方面遇到了困难。
如有任何帮助,我们将不胜感激。
函数模板名为ArraySizeHelper
,用于接受一个参数、对T [N]
的引用并返回对char [N]
的引用的函数。
宏传递您的对象(假设它是X obj[M]
)作为参数。编译器推断出CCD_ 5和CCD_。因此,它声明了一个返回类型为char (&)[M]
的函数。然后宏用sizeof
包装这个返回值,所以它实际上是在执行sizeof(char [M])
,也就是M
。
如果给它一个非数组类型(例如T *
),那么模板参数推断将失败。
正如@Alf在下面指出的,这种混合模板宏系统相对于替代的纯模板方法的优势在于,它为您提供了一个编译时间常数。
这不是最好的方法,但既然您在问:模板函数ArraySizeHelper
的返回类型是char[N]
,其中函数的参数是一个类型为T
的大小为N的(引用)数组。模板参数推导用匹配的数字N实例化这个模板,所以sizeof(char[N])
就是N,这就是你得到的。
一个更好的版本可以写如下。(constexpr
需要C++0x;如果省略它,这将不是一个常量表达式。)
template <typename T, size_t N> constexpr size_t array_size(const T (&)[N]) { return N; }
用法:
int x[20];
array_size(x); // == 20
更新:如果您使用C++0x,由于decltype:,这里有另一个提供constexpr的解决方案
#include <type_traits>
template <typename T> struct array_traits;
template <typename T, unsigned int N> struct array_traits<T[N]>
{
static const unsigned int size = N;
typedef std::decay<T>::type type;
};
// Usage:
int x[20];
array_traits<decltype(x)>::size; // == 20
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?