Chcę sprawdzić rozmiar następującą strukturę na instancji z static_assert
ograniczyć że bezimienny struct
jest szczelnie zapakowane, więc wielkość A
jest równoważna sizeof(T) * 3
.Static dochodzić wielkości typu szablonu na konkretyzacji
template <typename T>
struct A
{
union
{
struct { T a, b, c; };
T arr[3];
};
};
Można to zrobić z
static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong");
jednak
od
A<T>
wciąż niekompletny typ wewnątrz definicji klasy, stawiając wyżejstatic_assert
do definicji klasy jest opcja nie jest dostępnastatic_assert
zsizeof
nie ocenia wewnątrz funkcji un-instancja we wszystkich kompilatorów (jak Clang), więc wprowadzenie go do manekina funkcji członka nie jest opcjąstatic_assert
oddanie do konstruktora lub destruktora byłoby rozwiązanie , ale w powyższym przykładzie nie konstruktor zdefiniowany przez użytkownika istnieje (myślę o agregaty), ponadto wyobrazić przypadku wielu konstruktorów, gdzie wolałbym uniknąć wykonywania twierdzenie, w każdym z nichdziedziczenie
A
z innej struktury i wykonaniestatic_assert
na tym w de finition zA
byłoby rozwiązanie, ale chcę zachować prostego struct, nie brudząc ze strukturami pomocniczymi
Każde inne rozwiązanie mi brakuje?
Postanowiłem cofnąć to pytanie i pozostawić je otwartym na ewentualne rozwiązania w przyszłości.
Oczywiście 'sizeof' nie jest dozwolone na incomlete typów ale jeśli instancję struktury typu' T' nie może być niekompletny, inaczej po prostu by się nie skompilował, z lub bez 'sizeof' – SomeWittyUsername
Nie można utworzyć unii bez znajomości rozmiarów typów, więc i tak potrzebny jest typ. Zatem pierwsze rozwiązanie powinno być w porządku. – OMGtechy
Wciąż jest destruktor, ale (jak w przypadku konstruktora) możesz złamać niektóre właściwości (kruszywo, trywialnie niszczalne). Musisz włączyć/skopiować konstruktor/zadanie. – Jarod42