2016-03-29 9 views
5

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żej static_assert do definicji klasy jest opcja nie jest dostępna

  • static_assert z sizeof 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 nich

  • dziedziczenie A z innej struktury i wykonanie static_assert na tym w de finition z A 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.

+0

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

+0

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

+1

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

Odpowiedz

0

Jeden Specjalna funkcja członek (prawie) gwarantuje być instancja jest destruktor:

~A() noexcept { static_assert(sizeof(A<T>) == sizeof(T) * 3, "hey something went wrong"); } 
+0

Tak, ale jako @ Jarod42 również stwierdził w swoim komentarzu, że złamie zbiorową regułę i trywialnie domyślną zniszczalność. – plasmacel

Powiązane problemy