[英]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.