Ссылочный взлом от программиста C, желающего подорвать систему типов, чтобы получить то, что работает:
int (&array2)[5] = (int (&)[5])(*(array1 + 5));
Теперь array2
будет массивом для всех намерений и целей и будет подмассивом array1
, и даже будет передаваться этой известной шаблонной функции C ++ array_size
. Хотя лучший способ справиться с этой хакерской атакой - это спрятать ее еще больше!
#define make_sub_array(type, arr, off, len) (type (&)[len])(*(arr + off));
int (&array2)[5] = make_sub_array(int, array1, 5, 5);
Nice. Ужасно по некоторым стандартам, но конечный результат а) выглядит довольно аккуратно, б) делает именно то, что вы хотите, в) функционально идентичен фактическому массиву, и г) также будет иметь дополнительный бонус (или неправильную функцию) идентичная ссылка на оригинал, поэтому они меняются вместе.
ОБНОВЛЕНИЕ: Если вы предпочитаете, шаблонную версию (вроде):
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);
Нам еще нужно передать тип. Поскольку один из наших аргументов должен использоваться как часть приведения, мы не можем чисто (IMHO) избежать макроса. Мы могли бы сделать это:
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);
Но цель здесь состоит в том, чтобы сделать вызывающий код максимально чистым, и этот вызов немного сложен. Версия с чистым макросом, вероятно, имеет наименьшие издержки и, возможно, является самой чистой для реализации в этом случае.