【发布时间】:2010-05-31 16:32:45
【问题描述】:
寻找一种方法来为 c 样式数组进行可移植、安全的元素计数,我找到了这个解决方案:
template <typename T, unsigned N> char (&arrayCountofHelper(T(&)[N]))[N];
#define ARRAY_COUNTOF(arr) (sizeof(arrayCountofHelper(arr)))
看起来 arrayCountofHelper 实际上是对函数的引用,宏 ARRAY_COUNTOF 使用了函数的大小是它返回类型的大小这一事实。
它工作得很好。
但是,当我尝试检查它是否可移植时,我没有找到任何证据。我在标准 (14882/1998) 中找不到对 sizeof(function reference) 的任何引用,事实上,我不完全确定我什至可以再创建一个函数引用(尽管标准确实提到了几个次)。
那么,有人知道我应该在标准中看哪里吗? (或者,如果我以某种方式误解了声明,那么正确的解释是什么?)
谢谢
奥伦
附: (对于那些认为我没有找到适合我的问题的解决方案的人)
我知道我总是可以使用
#define ARRAY_COUNTOF sizeof(arr)/sizeof(arr[0])
甚至
template <typename T, unsigned N> size_t arrayCountof(T(&)[N]) {return N;}
但第一个不会检查 arr 是否为数组(或指针),第二个在 static_assert 中不可用。
(我会使用 std::tr1::array 或 std::vector,但这是我正在维护的遗留代码)
【问题讨论】:
-
另一种解释见这个答案:stackoverflow.com/questions/437150/…(底部)
-
不要忘记 C/C++ 中的数组会衰减为指针。所以要小心这里的非模板代码sn-p。 stackoverflow.com/questions/19452971/…