c – 静态在实例化时断言模板类型的大小

前端之家收集整理的这篇文章主要介绍了c – 静态在实例化时断言模板类型的大小前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在实例化时使用static_assert检查以下结构的大小,以约束未命名的struct紧密打包,因此A的大小等于sizeof(T)* 3.
template <typename T>
struct A
{
   union
   {
      struct { T a,b,c; };
      T arr[3];
   };
};

这可以用

static_assert(sizeof(A<T>) == sizeof(T) * 3,"hey something went wrong");

然而

>因为A< T>在其类定义中仍然是一个不完整的类型,将上面的static_assert放入类定义中不是一个选项
> staticofassert with sizeof不评估所有编译器(如Clang)中未实例化的函数内部,因此将它放入虚拟成员函数不是一个选项
>将static_assert放到构造函数或析构函数中将是一个解决方案,但在上面的示例中不存在用户定义的构造函数(考虑聚合),进一步想象多个构造函数的情况,我将避免在所有构造函数中执行断言
>从另一个结构继承A,并在A的定义中对它执行static_assert将是一个解决方案,但我想保持结构简单,而不会弄乱辅助结构

我失踪的任何其他解决方案?

我决定取消删除这个问题,并在将来为可能的解决方案保持开放.

解决方法

保证实例化的一个特殊成员函数(几乎)是析构函数
~A() noexcept { static_assert(sizeof(A<T>) == sizeof(T) * 3,"hey something went wrong"); }

猜你在找的C&C++相关文章