2015-10-24 14 views
6

Tôi biết có nhiều cách khác để triển khai hoặc sử dụng vùng chứa này. Đây chỉ là để thỏa mãn sự tò mò của tôi. Giả sử tôi có đoạn mã sau:Truyền mảng theo tham chiếu - tập hợp con của một mảng lớn hơn

void byref(int (&a)[5]); 

int main() 
{ 
    int a[5]; 
    byref(a); 
} 

Một lợi thế của đi qua một mảng C-style bằng cách tham khảo là sizeof sẽ làm việc trên nó, như sẽ std::end. Nhưng bây giờ nó chỉ có thể vượt qua một mảng chính xác kích thước này.

Có thể chuyển một tập hợp con của một mảng lớn hơn đến hàm này bằng cách tham chiếu không? Ví dụ: tôi muốn làm:

int main() 
{ 
    int a[10]; 
    byref(a + 1); 
} 

Có cách nào để thực hiện công việc này không?

tôi đã nhận nó để xây dựng và chạy, cho giá trị dự kiến ​​trong VS2015, nhưng tất nhiên các mã trông rất tinh ranh:

byref(reinterpret_cast<int(&)[5]>(*(a + 1))); 
+1

Sử dụng 'mảng_view'. –

+1

@KarolyHorvath, OP biết rằng có nhiều cách khác để triển khai hoặc sử dụng vùng chứa này. –

+0

Trong С ++ bạn có thể sử dụng mẫu: 'template void byref (int (& a) [N]);' – Constructor

Trả lời

1

Tôi chỉ có một ý tưởng về gói xấu trông đúc thành một chức năng:

#include <iostream> 
#include <cassert> 

void byref(int (&a)[5]) 
{ 
    std::cout << "Hello!" << std::endl; 
} 

template <size_t M, class T, size_t N> 
T (&subarray(T (&a)[N], size_t start))[M] 
{ 
    assert(start < N && start + M <= N); 
    return reinterpret_cast<T(&)[M]>(a[start]); 
} 

int main() 
{ 
    int a[5], b[8]; 
    byref(a); 
    byref(subarray<5>(subarray<6>(b, 0), 1)); 
} 
0

Với nguyên mẫu này, tôi không thấy cách nào khác để tiếp tục truyền.

Thông thường, tôi cũng thấy cái này: byref((int(&)[5])*(b + 5));, nhưng tất nhiên nó giống nhau và kém an toàn hơn của bạn.

Vì vậy, tôi không thấy bất kỳ cách rõ ràng và đẹp nào để thực hiện điều đó (ngoại trừ một macro có thể). Tôi sẽ upvote câu hỏi của bạn tuy nhiên, để xem nếu bạn đang thiếu một cái gì đó ở đây!

Các vấn đề liên quan