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

标签 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 来做到这一点吗?

最佳答案

当然:

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 个参数时,模板用户收到的错误消息可能会令人困惑。本例中的断言有助于给出更好的错误消息。

关于c++ - 如何在编译时检查数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47753302/

相关文章:

c++ - 可以使用静态变量来初始化/注册变量吗?

c++模板 - 指针中的预期类型说明符

c++ - 静态断言源代码在 C++ 中没有改变

c - 用于识别 ANSI C 中损坏的自动生成接口(interface)层的静态断言

c++ - 使用 ncurses 显示 wchar_t

c++ - 如何测试一个变量是否被初始化?

编译时在代码中替换了 Java 静态最终值?

c++ - 混合 C/C++ 源代码 : Get sizeof(C++ struct) in C code

C++ 模块 : module implementation units for unnecessary recompilation?

c++ - 通过 static_assert 强制执行模板类型