nhưng tôi không thể che giấu xung quanh cú pháp. Đặc biệt là phần T (&) [size]
...
Phần đó là tham chiếu đến một mảng. Có "right-left rule" để giải mã mọi khai báo C và C++ .
Bởi vì các mẫu chức năng suy ra các loại đối số mẫu từ các đối số hàm được cung cấp những gì mẫu chức năng này làm là suy ra loại và phần tử đếm của mảng và trả về số đếm.
Chức năng không thể chấp nhận loại mảng theo giá trị, thay vì chỉ bằng con trỏ hoặc tham chiếu. Các tài liệu tham khảo được sử dụng để tránh việc chuyển đổi tiềm ẩn của một mảng để con trỏ tới phần tử đầu tiên của mình (aka, phân rã mảng):
void foo(int*);
int x[10];
int* p = x; // array decay
foo(x); // array decay again
Mảng phân rã phá hủy các loại ban đầu của mảng và do đó kích thước của nó bị mất .
Lưu ý, vì đó là cuộc gọi hàm trong C++ 03, giá trị trả về không phải là hằng số thời gian biên dịch (tức là không thể sử dụng giá trị trả về làm đối số mẫu). Trong C++ 11 chức năng có thể được đánh dấu bằng constexpr
trở lại trong một thời gian liên tục biên dịch:
template<typename T, size_t size>
constexpr size_t siz(T(&)[size]) { return size; }
Để có được phần tử mảng được tính là một thời gian biên dịch liên tục trong C++ 03 một hình thức hơi khác nhau có thể được sử dụng:
template<class T, size_t size>
char(&siz(T(&)[size]))[size]; // no definition required
int main()
{
int x[10];
cout << sizeof siz(x) << '\n';
double y[sizeof siz(x)]; // use as a compile time constant 10
}
Ở phía trên nó tuyên bố một hàm mẫu với lập luận tương tự tham khảo-to-an-mảng, nhưng với kiểu giá trị trở lại của char(&)[size]
(đây là nơi "quy tắc phải trái" có thể được đánh giá cao) . Lưu ý rằng các cuộc gọi chức năng không bao giờ xảy ra tại thời gian chạy, đây là lý do tại sao định nghĩa của mẫu chức năng siz
là không cần thiết. sizeof siz(x)
về cơ bản là nói số "kích thước của giá trị trả lại là bao nhiêu nếu siz(x)
được gọi là".
C/C++ cách cũ nhận được số lượng phần tử của mảng như một thời gian biên dịch liên tục là:
#define SIZ(arr) (sizeof(arr)/sizeof(*(arr)))
bản sao có thể có của [Tại sao "tham chiếu đến mảng" được xác định theo cách gây nhầm lẫn trong C++?] (Http://stackoverflow.com/questions/6456253/why-is-reference-to-array-defined-in- như vậy khó hiểu-way-in-c) – sharptooth
không hoàn toàn trùng lặp –
Bạn có thể muốn sử dụng một mẫu bí danh và viết 'bí danh &' có thể dễ đọc hơn. –