Odpowiednik hacku Struct w C ++

Znany jest hack struct, w którym macie tablicę o długości 0 jako ostatni element struktury z C90 i C99, a wraz z wprowadzeniem elementów elastycznej tablicy w C99, mamy nawet znormalizowany sposób jej używania[]. Niestety, C ++ nie dostarcza takiej konstrukcji i (przynajmniej z Clangiem)3.4), kompilowanie struktury z jednym z nich[0] lub[] wygeneruje ostrzeżenie o kompilacji--std=c++11 -pedantic:

$ cat test.cpp 
struct hack {
  char filler;
  int things[0];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:14: warning: zero size arrays are an extension [-Wzero-length-array]
  int things[0];

i podobnie

$ cat test.cpp 
struct fam {
  char filler;
  int things[];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:7: warning: flexible array members are a C99 feature [-Wc99-extensions]
  int things[];

Moje pytanie zatem brzmi; powiedzmy, że chcę mieć strukturę, która zawiera tablicę o zmiennej wielkości jako ostatni element w C ++. Jaka jest właściwa rzecz, biorąc pod uwagę kompilator, który obsługuje oba? Powinienem iść z hackiem struct[0] (który jest rozszerzeniem kompilatora) lub FAM[] (która jest funkcją C99)? O ile mi wiadomo, albo zadziałają, ale staram się dowiedzieć, które jest mniejsze zło?

Zanim ludzie zaczną sugerować, że mająint* do oddzielnie przydzielonego fragmentu pamięci w strukturze, co nie jest satysfakcjonującą odpowiedzią. Chcę przydzielić pojedynczy kawałek pamięci do przechowywania zarówno elementów mojej struktury, jak i tablicy. Używanie std :: vector również należy do tej samej kategorii. Jeśli zastanawiasz się, dlaczego nie chcę używać wskaźnika, toOdpowiedź R. na inne pytanie daje dobry przegląd.

W innych miejscach pojawiły się podobne pytania, ale żadne nie daje odpowiedzi na to konkretne pytanie:

Czy elastyczne elementy tablicy są poprawne w C ++?: Bardzo podobne, ale pytanie brzmi, czy FAM jest poprawny w C ++ (nie). Szukam dobrego powodu, aby wybrać jeden lub drugi.Zgodny wariant starego „struct hack”: Proponuje alternatywę, ale nie jest ani ładna, ani zawsze poprawna (co jeśli dopełnienie zostanie dodane do struktury?). Dostęp do elementów później nie jest tak czysty, jak to się robie.things[42].

questionAnswers(6)

yourAnswerToTheQuestion