Załóżmy, że mam std::array<T, n>
i chcę pobrać odwołanie do jej zawartości (tj. Do nienaświetlonych elems
element tablicy).Odwzoruj tablicę `T (&) [n]` na zawartość `std :: array <T, n>`
Zaskoczyło mnie, że std::array<T, n>::data()
zwraca T *
, a nie T (&)[n]
, więc wydaje się, że potrzebny jest jakiś rzut. Mogę napisać:
std::array<int, 5> arr;
int (&ref)[5] = *reinterpret_cast<int (*)[5]>(arr.data());
Jednak to wygląda brzydko i potencjalnie niebezpieczne. Czy jest to uzasadniony (dobrze zdefiniowany) kod i czy istnieje lepszy sposób na zrobienie tego?
Proponuję szablon szablonu funkcji "constexpr" wielokrotnego użytku, aby ukryć tę brzydotę. –
Narożny przypadek będzie miał rozmiar 0, w którym to przypadku prawa strona będzie niezdefiniowana, chociaż w tym szczególnym przypadku lewa strona nie będzie się nawet kompilować (tj. Nie można zadeklarować tablicy 0 elementów) –
Użycie 'arr.size()' zamiast '5' byłoby mniej kruche (to' constexpr' i może być używane jako rozmiar tablicy). Nie jestem pewien, czy obsada jest dobrze zdefiniowana. –