Подтвердить что ты не робот

Статические утверждения о размере структуры шаблона

Мне нужно, чтобы структура шаблона была точно размером с ее членами. 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");
};

Это не работает. Итак, как это сделать? Я не хочу обременять людей, которые создают экземпляр шаблона, чтобы проверить себя в каждом экземпляре. Проверка должна быть полностью автоматической при создании экземпляра структуры.

4b9b3361

Ответ 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");
 }
};

Это работает, потому что содержимое функций-членов не скомпилируется, пока класс не имеет полного определения.

Нет необходимости вызывать функцию.