Tham chiếu Hack từ một lập trình viên C sẵn sàng để lật đổ hệ thống kiểu để có được những gì hoạt động:
int (&array2)[5] = (int (&)[5])(*(array1 + 5));
Bây giờ array2
sẽ là một mảng cho tất cả các tính năng, và sẽ là một tiểu mảng của array1
và thậm chí sẽ có thể chuyển sang hàm mẫu C++ array_size
nổi tiếng đó. Mặc dù cách tốt nhất để xử lý tin tặc này là giấu nó với nhiều tin tặc hơn!
#define make_sub_array(type, arr, off, len) (type (&)[len])(*(arr + off));
int (&array2)[5] = make_sub_array(int, array1, 5, 5);
Tốt. Khủng khiếp bởi một số tiêu chuẩn, nhưng kết quả cuối cùng a) trông khá gọn gàng, b) thực hiện chính xác những gì bạn muốn, c) có chức năng giống với một mảng thực, và d) cũng sẽ có thêm tiền thưởng (hoặc tính năng sai) một tham chiếu giống hệt với bản gốc, do đó, cả hai thay đổi cùng nhau.
UPDATE: Nếu bạn thích, một phiên bản templated (loại):
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);
Chúng ta vẫn phải vượt qua các loại. Vì một trong các đối số của chúng ta phải được sử dụng như một phần của diễn viên, chúng ta không thể xóa sạch (IMHO) tránh được macro. Chúng tôi có thể thực hiện việc này:
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);
Nhưng mục tiêu ở đây là làm cho mã gọi càng sạch càng tốt và cuộc gọi đó hơi khó khăn. Phiên bản tinh khiết-macro có thể có chi phí thấp nhất và có lẽ là phần mềm sạch nhất để triển khai trong trường hợp này.
Hãy nhớ rằng bạn sẽ không thể tạo ra một mảng phụ bằng cách trỏ đến một phần tử. – GManNickG
Phần tử thứ 96 của 'mảng1' là' mảng1 [95] '. Khi bạn nói "đặt chúng trong mảng2", nó * có nghĩa là * sao chép, làm cách nào khác bạn sẽ đặt chúng trong mảng2? Không có cách nào để làm những gì bạn muốn. Bạn cần sao chép các phần tử, hoặc có một con trỏ trỏ tới phần tử thứ 96 của 'mảng1', hoặc có một mảng gồm 5 con trỏ, và có con trỏ' i' trỏ đến phần tử '95 + i' của' mảng1 '. –
bạn là chính xác, bằng cách "đặt chúng array2" Tôi không có nghĩa là để sao chép. Tôi xin lỗi vì sự hỗn hợp trong thuật ngữ. –