hack referencyjny programista C chcących obalić system typu, aby uzyskać to działa:
int (&array2)[5] = (int (&)[5])(*(array1 + 5));
Teraz array2
będzie tablica dla wszystkich zamiarów i celów, i będzie sub-tablicę array1
, a nawet będzie znośna dla tej znanej funkcji szablonu C++ array_size
. Chociaż najlepszym sposobem na poradzenie sobie z tym hackery jest ukryć go z więcej hackery!
#define make_sub_array(type, arr, off, len) (type (&)[len])(*(arr + off));
int (&array2)[5] = make_sub_array(int, array1, 5, 5);
Nice. Okropne według niektórych standardów, ale wynik końcowy a) wygląda całkiem zgrabnie, b) robi dokładnie to, czego oczekujesz, c) jest funkcjonalnie identyczny z rzeczywistą tablicą, i d) będzie również miał dodatkową premię (lub niewłaściwą funkcję) bycia identyczne odniesienie do oryginału, więc dwie zmiany razem.
UPDATE: Jeśli wolisz, wersja matrycy (rodzaj):
template <typename T, size_t M>
T (&_make_sub_array(T (&orig)[M], size_t o))[]
{
return (T (&)[])(*(orig + o));
}
#define make_sub_array(type, array, n, o) (type (&)[n])_make_sub_array(array, o)
int (&array2)[5] = make_sub_array(int, array1, 5, 5);
Mamy jeszcze przekazać typ. Ponieważ jeden z naszych argumentów musi być użyty jako część obsady, nie możemy w czysty sposób (IMHO) unikać tego makra. Moglibyśmy to zrobić:
template <typename T, size_t M, size_t N>
T (&make_sub_array(T (&orig)[M], size_t o))[N]
{
return (T (&)[N])(*(orig + o));
}
int (&array2)[5] = make_sub_array<int, 15, 5>(array1, 5);
Jednak celem jest uczynienie kodu wywołującego możliwie najczystszym, a połączenie jest nieco owłosione. Wersja czysto makro ma prawdopodobnie najmniejszy narzut i prawdopodobnie jest najczystsza w tym przypadku.
Należy pamiętać, że technicznie nie tworzy się podszablonu, wskazując na element. – GManNickG
96. elementem 'tablica1' jest' tablica1 [95] '. Kiedy mówisz "umieść je w tablicy2", oznacza to * kopiowanie, jak inaczej umieścisz je w tablicy 2? Nie ma sposobu, aby zrobić to, co chcesz. Musisz albo skopiować elementy, albo mieć wskaźnik wskazujący na 96. element tablicy 'tablica1' lub tablicę 5 wskaźników, a wskaźnik" i "wskazywać na element' 95 + i' z 'tablica1 '. –
masz rację, przez "umieszczenie ich array2" nie chciałem kopiować. Przykro mi z powodu pomieszania terminologii. –