static_assert 在宏中,但也扩展为可用作函数参数的内容
static_assert in a macro but also expand to something that can be used as a function parameter
比如。我有扩展为 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;
}
那么你不需要断言大小,因为你只能使用实际数组的函数。
比如。我有扩展为 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;
}
那么你不需要断言大小,因为你只能使用实际数组的函数。