我有一个模板类,其中模板参数对应于类中数组的大小。
template <typename T, size_t S>
class Example {
...
private:
T values[S];
};
Run Code Online (Sandbox Code Playgroud)
这会导致预期的警告:“ISO C++ 禁止零大小数组。” 在我的情况下,类似的东西是Example<uint8_t, 0>
没有意义的,我想阻止包含的代码Example<..., 0>
编译。
我如何在 C++ 中表示S
应该优于或等于 1?
C++20的方式是
template <typename T, size_t S> requires (S > 0)
class Example
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
您实际上是在用一种编译器诊断换取另一种,但这是一种方法:
template <typename T, size_t S,
typename=std::enable_if_t< (S>0) >>
Run Code Online (Sandbox Code Playgroud)
或者:用于static_assert
获取更友好的错误消息:
template <typename T, size_t S>
class Example {
private:
static_assert(S>0);
T values[S];
};
Run Code Online (Sandbox Code Playgroud)
您将收到更友好的错误消息,但是此模板仍将参与重载解析,这在某些边缘情况下可能是不可取的。