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

Joh*_*ohn 1 c++ macros static-assert c++11

例如.我有CHARCOUNT(x)扩展到的宏sizeof(x)/sizeof(x[0]).我想static_assert用来确保每个宏扩展检查结果是否大于2,以避免有人传入指向字符串的指针而不是指向字符数组的指针.

我想要像这样的静态断言:

static_assert(x) > 2
Run Code Online (Sandbox Code Playgroud)

此宏将用于确保字符串副本不超过缓冲区大小,例如:

TCHAR szMyStr[10];
_tcscpy_s(szMyStr, CHARCOUNT(szMyStr), L"My result");
Run Code Online (Sandbox Code Playgroud)

如果有人意外地传入一个指针,其中CHARCOUNT将导致指向字符串的指针的长度,而不是我希望在编译时断言的字节数.

const TCHAR* myChars = L"My result";
auto len = CHARCOUNT(myChars);
Run Code Online (Sandbox Code Playgroud)

CHARCOUNT上述应导致编译时断言.任何指针都会有所帮助.

Pez*_*ezo 7

您应该使用std::extent而不是该宏,它为不支持的类型提供0(例如,没有边界的数组,非数组类型).

对于您的用例,constexpr函数为您提供数组变量的大小将更适合,如下所示:

template <typename T, std::size_t N>
constexpr std::size_t arrsize(T (&)[N]) {
    return N;
}
Run Code Online (Sandbox Code Playgroud)

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