2011-11-07 25 views
6

Given:Tính năng nào của C++ cho phép các lớp mẫu tự giới thiệu mà không có đối số mẫu?

template <typename T> 
class C { 
    C & operator ++() { ... } 
}; 

Tại sao/làm thế nào là C phép khai báo các biến và chức năng của loại C hơn là cần thiết để đặt tên cho C<T>? Tôi đã không thực sự nghĩ về nó trước khi làm việc trên một mẫu với nhiều thông số mà sẽ làm cho chính tả ra "tự loại" bất tiện.

Có bất kỳ điều kỳ quặc nào mà tôi nên biết không?

Trả lời

6

[n3290: 14.6.1/1]: Giống như (không mẫu) các lớp học bình thường, lớp mẫu có tiêm-class-name (khoản 9). Tên mẫu được cấp có thể được sử dụng làm tên mẫu hoặc loại tên. Khi nó được sử dụng với một mẫu đối số-list, như một mẫu đối số cho một mẫu mẫu tham số, hoặc như nhận diện cuối cùng trong xây dựng-type-specifier của một lớp người bạn tuyên bố mẫu, nó đề cập đến chính mẫu lớp. Nếu không, nó tương đương với tên mẫu , theo sau là mẫu tham số của mẫu lớp được đính kèm trong <>.

Đặc biệt, nó chỉ là một tính năng tiện lợi.

+3

Thật tuyệt vời khi hai người bỏ phiếu này trong khi tôi trích dẫn thông tin sai ;-) Sức mạnh của trích dẫn tiêu chuẩn - _any_ một phần của tiêu chuẩn, rõ ràng - không thể bị từ chối! –

+0

Aha, khái niệm mà tôi đã bỏ lỡ là * tên lớp được tiêm *. Cảm ơn! –

+0

@BenJackson: Không sao cả! –

2

Đó chỉ là cú pháp.

Sẽ thuận tiện khi bạn không phải thay đổi chữ ký của các phương thức nếu bạn phải thay đổi các tham số mẫu.

2

Tại sao/C được phép khai báo biến và chức năng của loại C thay vì bắt buộc phải đặt tên C như thế nào?

Nó chỉ được chỉ định như thế này. Tên của khuôn mẫu được tiêm vào cơ thể của nó và có nghĩa là loại thực tế (với các đối số).

Có bất kỳ điều kỳ quặc nào mà tôi nên biết không?

Không có gì nghiêm trọng. Bạn chỉ cần nhớ điều này không hiệu quả đối với các lớp cơ sở, do đó, để thực hiện CRTP, bạn phải làm

template <class T> 
class A : public Base<A<T> > // not Base<A> 
+2

Trừ khi 'Base' dự kiến ​​tham số mẫu mẫu. ;) – Xeo

+0

@Xeo: có, nhưng trong CRTP, lớp cơ sở mong đợi loại có nguồn gốc. – jpalecek

+0

Một loại trừ loại kia. – Xeo

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