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.