例如。我有扩展到CHARCOUNT(x)
的宏sizeof(x)/sizeof(x[0])
。我想使用static_assert
来确保每个宏扩展都进行检查以查看结果是否大于2,以避免有人传递指向字符串的指针而不是指向字符数组的指针。
我想要这样的静态断言:
static_assert(x) > 2
此宏将用于确保字符串副本不超过缓冲区大小,例如:
TCHAR szMyStr[10];
_tcscpy_s(szMyStr, CHARCOUNT(szMyStr), L"My result");
如果有人不小心传入了一个指针,其中CHARCOUNT将导致指向字符串的指针的长度,而不是字节数,那么我希望在编译时声明一个断言。
const TCHAR* myChars = L"My result";
auto len = CHARCOUNT(myChars);
上面的
CHARCOUNT
应该导致一个编译时断言。任何指针都会有所帮助。
最佳答案
您应该使用 std::extent
而不是该宏,它为不受支持的类型(例如无边界的数组,非数组类型)提供0。
对于您的用例,使用constexpr函数为您提供数组变量的大小会更合适,例如:
template <typename T, std::size_t N>
constexpr std::size_t arrsize(T (&)[N]) {
return N;
}
然后,您无需声明大小,因为您只能将函数与实际数组一起使用。