Ein Referenz Hack aus einem C-Programmierer bereit, das Typ-System zu untergraben, was zu bekommen funktioniert:
int (&array2)[5] = (int (&)[5])(*(array1 + 5));
Jetzt ein Array für alle Absichten und Zwecke array2
wird, und wird ein Sub-Array von array1
sein und wird sogar zu dieser berühmten C++ array_size
Template-Funktion passierbar sein. Obwohl der beste Weg, mit diesem Hacker umzugehen, ist es, ihn mit mehr Hackerei zu verstecken!
#define make_sub_array(type, arr, off, len) (type (&)[len])(*(arr + off));
int (&array2)[5] = make_sub_array(int, array1, 5, 5);
Schön. Schrecklich nach einigen Standards, aber das Endergebnis a) sieht ziemlich ordentlich aus, b) macht genau das, was Sie wollen, c) ist funktionell identisch mit einem tatsächlichen Array und d) hat auch den zusätzlichen Bonus (oder Fehlmerkmal) des Seins ein identischer Bezug zum Original, so ändern sich die beiden zusammen.
UPDATE: Wenn Sie möchten, eine Templat-Version (Art):
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);
Wir haben noch den Typ zu übergeben. Da eines unserer Argumente als Teil der Besetzung verwendet werden muss, können wir das Makro nicht sauber (IMHO) vermeiden. Wir könnten dies tun:
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);
Aber das Ziel ist hier die Telefonvorwahl so sauber wie möglich zu machen, und dieser Anruf ist ein bisschen haarig. Die Pure-Macro-Version hat wahrscheinlich den geringsten Overhead und ist wahrscheinlich in diesem Fall am saubersten zu implementieren.
Denken Sie daran, dass Sie ein Sub-Array nicht technisch machen, indem Sie auf ein Element zeigen. – GManNickG
Das 96. Element von 'array1' ist' array1 [95] '. Wenn du sagst "setze sie in array2", bedeutet das * kopieren, wie sonst wirst du sie in array2 einfügen? Es gibt keine Möglichkeit zu tun, was Sie wollen. Sie müssen entweder die Elemente kopieren oder einen Zeiger haben, der auf das 96. Element von 'array1' zeigt, oder ein Array von 5 Zeigern haben, und den Zeiger' i' auf das Element '95 + i' von' array1 zeigen lassen '. –
Sie sind richtig, indem Sie "Array2" setzen, wollte ich nicht kopieren. Ich bedauere die Verwechslung in der Terminologie. –