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;
}

那么你不需要断言大小,因为你只能使用实际数组的函数。