Việc giới thiệu giấy là sai lầm: thành ngữ thực sự là
template <typename T, T t>
Nó biểu thị một mẫu mà phụ thuộc vào một loại T
và một giá trị t
của loại đó. Ký hiệu hơi nặng vì trong hầu hết các trường hợp, kiểu có thể được suy ra từ chính giá trị đó.
Ví dụ:
// the current definition notation
template <typename T, T t> void f() { t.f(); };
//// the proposed definition notation
//// the parameter t depends on an implicit typename parameter T
// template <using typename T, T t> void f() { t.f(); };
struct foo {
void f(){
// some computation
}
};
foo bar;
int main(){
// the current instantiation notation
f<foo,bar>();
//// the proposed instantiation notation
//// we know that bar is of type foo, so we don't need to specify it
// f<bar>();
}
Đề xuất giới thiệu một chút "đường cú pháp" để làm cho ký hiệu dễ viết hơn. Ngoài ra, ví dụ ở trên là tầm thường trong mô tả của nó (và có thể sai, vì thông số mẫu cần phải là constexpr
), nhưng bài báo mô tả một số tình huống mà ký pháp hiện tại có thể trở nên khá lông, giảm khả năng đọc và dễ dàng tổng thể lập trình.
Bắt đầu bằng mẫu 'template void foo (T t);'. Đặt tham số đó thành giá trị biên dịch: 'template void bar();' (tôi nghĩ bạn có nghĩa là thay vì 'class'). Bây giờ nghĩ về cách bạn có thể gọi 'foo (5);' cho T là 'int', nhưng để làm điều đó với' bar', bạn cần 'bar ();'. Điều đó có đi đúng hướng không? –
chris
Tôi đã có nghĩa là T t, không phải lớp T. Cố định điều đó. –
@chris Tôi biết bạn đang đi đâu. thanh cần phải chung chung trên bất kỳ loại nào chúng tôi cung cấp, nhưng cũng lấy giá trị của cùng một loại như một tham số mẫu khác. Chúng ta cần xác định cả kiểu và giá trị của nó để suy luận rằng 5 là một int. Đề xuất cho thấy việc sử dụng điều này trong thư viện phản ánh, nhưng tôi chưa bao giờ thấy nó cho đến ngày hôm nay. Làm thế nào khác có thể được sử dụng? –