如何防止模板参数中的零?

Ars*_*nko 7 c++ templates

我有一个模板类,其中模板参数对应于类中数组的大小。

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?

Hol*_*Cat 9

C++20的方式是

template <typename T, size_t S> requires (S > 0)
class Example
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)


Sam*_*hik 7

您实际上是在用一种编译器诊断换取另一种,但这是一种方法:

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)

您将收到更友好的错误消息,但是此模板仍将参与重载解析,这在某些边缘情况下可能是不可取的。