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

时间:2017-12-11 12:45:16

标签: c++ compilation static-assert

我有这段代码:

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个字符作为模板参数输入到类中。在编译期间我该怎么办?

无论如何我可以使用static_asset吗?

1 个答案:

答案 0 :(得分:2)

不确定

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个参数时获得的错误消息可能会令人困惑。在这种情况下的断言有助于提供更好的错误消息。