Un hack di riferimento da un programmatore C disposti a sovvertire il sistema di tipi per ottenere quello che funziona:
int (&array2)[5] = (int (&)[5])(*(array1 + 5));
Ora array2
sarà un array per tutti gli effetti, e sarà un sub-array di array1
e sarà persino passabile a quella famosa funzione modello C++ array_size
. Anche se il modo migliore per gestire questo hackery è quello di nasconderlo con più hacker!
#define make_sub_array(type, arr, off, len) (type (&)[len])(*(arr + off));
int (&array2)[5] = make_sub_array(int, array1, 5, 5);
Nice. Terribile secondo alcuni standard, ma il risultato finale a) sembra piuttosto accurato, b) fa esattamente quello che vuoi, c) è funzionalmente identico a un array reale, e d) avrà anche il bonus (o caratteristica errata) di essere un riferimento identico all'originale, quindi i due cambiano insieme.
UPDATE: Se si preferisce, una versione su modelli (o quasi):
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);
Dobbiamo ancora passare il tipo. Poiché uno dei nostri argomenti deve essere usato come parte del cast, non possiamo pulire (IMHO) evitando la macro. Si potrebbe fare questo:
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);
Ma l'obiettivo è quello di rendere il codice chiamante più pulito possibile, e quella chiamata è un po 'pelosa. La versione pure-macro ha probabilmente il minor overhead ed è probabilmente la più pulita da implementare in questo caso.
Tenete a mente non sarà tecnicamente essere fare un sub-array da punta a un elemento. – GManNickG
Il 96 ° elemento di 'array1' è' array1 [95] '. Quando dici "mettili in array2", significa * copiando, in che altro modo li metterai in array2? Non c'è modo di fare quello che vuoi. È necessario copiare gli elementi o disporre di un puntatore che punta al 96 ° elemento di 'array1', oppure disporre di una matrice di 5 puntatori e fare in modo che il puntatore' i' punti all'elemento '95 + i' di' array1 '. –
hai ragione, "mettendo loro array2" non intendevo copiare. Mi dispiace per la confusione terminologica. –