【发布时间】:2014-02-08 01:18:21
【问题描述】:
给定一个数组a,我希望countof(a) 将数组中的元素数作为编译时常数产生。如果我有一个指针p,我希望countof(p) 不编译。这似乎应该是 (1) 简单明了并且 (2) 通常包含在 SO 中,但是 (1) 我无法让它工作,并且 (2) 搜索 SO 没有发现任何东西。
这是我的尝试。
#include <cstddef>
#include <type_traits>
template<typename T, std::size_t n,
typename = typename std::enable_if<std::is_array<T>::value>::type>
constexpr std::size_t countof(T (&)[n]) { return n; }
template<typename T,
typename = typename std::enable_if<std::is_pointer<T>::value>::type>
void countof(T*) = delete;
int main()
{
int a[10];
auto asize = countof(a); // should compile
static_assert(countof(a) == 10,
"countof(a) != 10!");
int *p;
auto psize = countof(p); // shouldn't compile
}
帮助?
【问题讨论】:
-
为什么要编译?
typename std::enable_if<std::is_array<T>::value>::type将是错误的,因为int将失败is_array。 -
@remyabel:哇!你当然是对的。
标签: c++ arrays templates c++11 enable-if