Статические утверждения о размере структуры шаблона
Мне нужно, чтобы структура шаблона была точно размером с ее членами. static_assert
представляется здесь инструментом выбора. Однако я не могу использовать static_assert
внутри самой структуры, потому что размер пока не известен. Вот что я хотел бы иметь:
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");
};
Это не работает. Итак, как это сделать? Я не хочу обременять людей, которые создают экземпляр шаблона, чтобы проверить себя в каждом экземпляре. Проверка должна быть полностью автоматической при создании экземпляра структуры.
Ответы
Ответ 1
Переименуйте foo
в 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;
Обратите внимание, что использование foo
вместо foo_t
блокирует дедукцию в некоторых случаях, поэтому этот метод не идеален.
Ответ 2
Вы можете добавить слой:
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");
};
Ответ 3
Поместите статическое утверждение в функцию-член.
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");
}
};
Это работает, потому что содержимое функций-членов не скомпилируется, пока класс не имеет полного определения.
Нет необходимости вызывать функцию.