如何在编译时检查数组的大小

how to check the size of an array during compile time

我有这个代码:

template<char... Ts>
class  myIDClass 
{
protected:
       std::vector<uint8_t> m_ID = { Ts... };

public:
       std::vector<uint8_t> getID()
        {
             return m_ID;
        }
}

我可以这样使用它:

class   MyClass: myIDClass<'1','2','3','4','5','6','7','8'>
{
  // some code here
}

MyClass mc;

但我想确保使用 myIDClass 的人准确输入 8 个字符作为模板参数输入 class。编译时怎么办?

我是否可以使用 static_asset 来做到这一点?

当然可以:

template<char... Ts>
class myIDClass
{
    static_assert(sizeof...(Ts) == 8, "myIDClass needs 8 template arguments");

    // ...

但是,由于您在编译时就知道您需要 8 个值,因此可以使用 std::array 代替:

#include <array>
// ...

template<char... Ts>
class  myIDClass 
{
    // The assertion is not actually needed, but you might still want to keep
    // it so that the user of the template gets a better error message.
    static_assert(sizeof...(Ts) == 8, "myIDClass needs 8 template arguments");

protected:
    std::array<uint8_t, 8> m_ID = { Ts... };

public:
    std::array<uint8_t, 8> getID()
    {
        return m_ID;
    }
};

在这种情况下,您不再需要 static_assert。但是,模板用户在未使用恰好 8 个参数时收到的错误消息可能会令人困惑。本例中的断言有助于发出更好的错误消息。