繁体   English   中英

类中的 static_assert 以强制执行内存布局

[英]static_assert in class to enforce memory layout

我正在尝试使用 static_assert 来确保其他程序员避免扩展某个类超出其预期用途,因为它通常用于低级计算,其中假定字节数与下面的静态断言要检查的一样。

template<typename T, int N>
class MyClass final
{
public:
    // This is the static_assert I need to fix
    static_assert(sizeof(MyClass<T, N>) == sizeof(T) * N, "Wrong size");

    // rest of code goes here... 
};

不幸的是,它不适用于:

    static_assert(std::is_standard_layout<T>::value, "Wrong Size");

因为在那之后仍然有可能污染班级。

我真的很想添加这个检查,因为如果有人更改了这个类,即使它成为虚拟的或添加一个新成员,那么在稍后阶段执行代码的结果将是不确定的。

static_assert(sizeof(MyClass<T, N>) == sizeof(T) * N, "Wrong size");

无法在课堂内工作,因为此时MyClass<T, N>不完整。 您可以将static_assert移动到 ctor/dtor 中。 缺点 - 断言只会在实例化时触发。 例如

template<typename T, int N>
class MyClass final
{
public:
    static_assert(std::is_standard_layout<T>::value, "T has to provide standard layout");

    MyClass()
    {
        static_assert(sizeof(MyClass<T, N>) == sizeof(T) * N, "Wrong size");
        static_assert(std::is_standard_layout<MyClass<T, N>>::value, "MyClass has to provide standard layout");

    }
    T _m[N];
    // rest of code goes here... 
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM