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

pla*_*cel 7 c++ templates static-assert

我想在实例化时检查以下结构的大小,static_assert以约束未命名struct的紧密包装,因此大小A相当于sizeof(T) * 3.

template <typename T>
struct A
{
   union
   {
      struct { T a, b, c; };
      T arr[3];
   };
};
Run Code Online (Sandbox Code Playgroud)

这可以用

static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong");
Run Code Online (Sandbox Code Playgroud)

然而

  • 因为A<T>在其类定义中仍然是一个不完整的类型,所以将上述内容static_assert放入类定义中是不可取的

  • static_assertwith sizeof不评估所有编译器(如Clang)中未实例化的函数内部,因此将其放入虚拟成员函数不是一种选择

  • 放入static_assert构造函数或析构函数将是一个解决方案,但在上面的示例中不存在用户定义的构造函数(考虑聚合),进一步想象多个构造函数的情况,我将避免在所有构造函数中执行断言

  • 继承A自另一个结构,并static_assert在定义中执行A将是一个解决方案,但我想保持结构简单,而不会搞乱辅助结构

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

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

eca*_*mur 0

析构函数是一种(几乎)保证被实例化的特殊成员函数:

~A() noexcept { static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong"); }
Run Code Online (Sandbox Code Playgroud)