static_assert在宏中,但也可以扩展到可以用作函数参数的东西

static_assert in a macro but also expand to something that can be used as a function parameter

本文关键字:函数 参数 扩展到 assert 也可以 static      更新时间:2023-10-16

例如。我有一个扩展为sizeof(x)/sizeof(x[0])的宏CHARCOUNT(x)。我想使用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;
}

然后,您不需要断言大小,因为您只能将函数与实际数组一起使用。