例如。我有扩展到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;
}

然后,您无需声明大小,因为您只能将函数与实际数组一起使用。

10-06 06:04