c++ templates sizeof static-assert

c++ - Afirmaciones estáticas sobre el tamaño de una estructura de plantilla



templates sizeof (3)

Necesito asegurarme de que una estructura de plantilla sea exactamente del tamaño de sus miembros. static_assert parece ser la herramienta elegida aquí. Sin embargo, no puedo usar un static_assert dentro de la propia estructura, porque el tamaño aún no se conoce allí. Esto es lo que me gustaría tener:

template<typename T1,typename T2> struct foo { T1 v1; T2 v2; // Doesn''t compile, invalid application of sizeof to incomplete type static_assert(sizeof(foo<T1,T2>)==sizeof(T1)+sizeof(T2),"Struct size invalid"); };

Esto no funciona. Así que ¿cómo se hace? No quiero cargar a la gente que crea una instancia de la plantilla para que se verifique a sí misma en cada instanciación. La verificación debe ser completamente automática cada vez que la estructura es instanciada.


Coloque la aserción estática en una función miembro.

template<typename T1,typename T2> struct foo { T1 v1; T2 v2; static auto assertion() { static_assert(sizeof(foo<T1,T2>)==sizeof(T1)+sizeof(T2),"Struct size invalid"); } };

Esto funciona porque el contenido de las funciones miembro no se compila hasta que la clase tenga una definición completa.

No hay necesidad de llamar a la función.


Puedes añadir una capa:

template<typename T1,typename T2> struct bar { T1 v1; T2 v2; }; template<typename T1,typename T2> struct foo : bar<T1, T2> { static_assert(sizeof(bar<T1, T2>) == sizeof(T1) + sizeof(T2), "Struct size invalid"); };


Renombrar foo a foo_t .

template<class A, class B> struct foo_helper { using type=foo_t<A,B>; static_assert(sizeof(A)+sizeof(B) == sizeof(type), "ouch"); }; template<class A, class B> using foo=typename foo_helper<A,B>::type;

Tenga en cuenta que usar foo lugar de foo_t bloquea la deducción en algunos casos, por lo que esta técnica no es perfecta.