N
không được "khởi tạo" cho bất kỳ thứ gì. Nó không phải là một biến. Nó không phải là một vật thể. N
là hằng số biên dịch. N
chỉ tồn tại trong quá trình biên dịch. Giá trị của N
cũng như số thực tế T
được xác định bởi quá trình được gọi là khấu trừ đối số mẫu. Cả hai T
và N
được suy ra từ loại đối số thực tế mà bạn chuyển đến chức năng mẫu của bạn.
Trong lần gọi đầu tiên, loại đối số là int[6]
, do đó trình biên dịch suy ra rằng T == int
và N == 6
, tạo ra một hàm riêng biệt cho điều đó và gọi nó. Hãy đặt tên cho nó cal_size_int_6
void cal_size_int_6(int (&a)[6])
{
std::cout << "size of array is: " << 6 << std::endl;
}
Lưu ý rằng không có T
và không N
trong chức năng này nữa. Cả hai đều được thay thế bằng giá trị suy luận thực tế của chúng tại thời gian biên dịch.
Trong lần gọi đầu tiên, loại đối số là int[1]
, do đó trình biên dịch suy ra rằng T == int
và N == 1
, tạo ra một chức năng riêng biệt cho điều đó và gọi nó. Hãy đặt tên cho nó là cal_size_int_1
void cal_size_int_1(int (&a)[1])
{
std::cout << "size of array is: " << 1 << std::endl;
}
Điều tương tự ở đây.
bạn main
về cơ bản chuyển thành
int main()
{
int a[]={1,2,3,4,5,6};
int b[]={1};
cal_size_int_6(a);
cal_size_int_1(b);
}
Nói cách khác, mẫu cal_size
bạn mang đến cho sinh hai chức năng khác nhau (cái gọi là chuyên ngành của mẫu ban đầu), đều có giá trị khác nhau của N
(và T
) được mã hóa cứng vào cơ thể. Đó là cách các mẫu làm việc trong C++.
Xem http: // stackoverflow.com/questions/437150/can-someone-explain-this-template-code-đó-cung cấp cho tôi-the-size-of-an-mảng (dupe?) –
"mẫu đối số khấu trừ" là những gì tôi đang tìm kiếm. Cảm ơn Andrey :) –