Sự khác biệt giữa lớp mẫu và lớp mẫu là gì?
Sự khác biệt giữa lớp mẫu và lớp mẫu là gì?
Câu trả lời:
Đây là điểm nhầm lẫn phổ biến đối với nhiều người (bao gồm cả trang Lập trình Chung trên Wikipedia, một số hướng dẫn C ++ và các câu trả lời khác trên trang này). Đối với C ++, không có cái gọi là "lớp mẫu", chỉ có một "khuôn mẫu lớp." Cách đọc cụm từ đó là "khuôn mẫu cho một lớp", trái ngược với "khuôn mẫu hàm", là "khuôn mẫu cho một hàm". Một lần nữa: các lớp không định nghĩa mẫu, mẫu xác định các lớp (và các hàm). Ví dụ: đây là một mẫu , cụ thể là một mẫu lớp , nhưng nó không phải là một lớp :
template<typename T> class MyClassTemplate
{
...
};
Khai báo MyClassTemplate<int> là một lớp, hoặc về cơ bản, một lớp dựa trên một khuôn mẫu. Không có thuộc tính đặc biệt nào của một lớp dựa trên mẫu so với một lớp không dựa trên mẫu. Các thuộc tính đặc biệt là của chính mẫu .
Cụm từ "lớp mẫu" không có nghĩa gì, bởi vì từ "mẫu" không có nghĩa như một tính từ khi áp dụng cho danh từ "lớp" theo như C ++ có liên quan. Điều đó ngụ ý sự tồn tại của một lớp mà là (hay định nghĩa) một mẫu , mà không phải là một khái niệm tồn tại trong C ++.
Tôi hiểu sự nhầm lẫn phổ biến, vì nó có thể dựa trên thực tế là các từ xuất hiện theo thứ tự "lớp mẫu" trong ngôn ngữ thực tế, đó là một câu chuyện hoàn toàn khác.
Bjarne Stroustrup, người tạo ra C ++, cho biết trong cuốn sách Ngôn ngữ lập trình C ++ ấn bản lần thứ 4 , 23.2.1 Định nghĩa mẫu:
Có những người phân biệt ngữ nghĩa giữa mẫu lớp thuật ngữ và lớp mẫu . Tôi không; điều đó sẽ quá tinh tế: vui lòng xem xét các điều khoản đó có thể hoán đổi cho nhau. Tương tự, tôi coi mẫu hàm có thể hoán đổi cho nhau với hàm mẫu .
Sự khác biệt là thuật ngữ "lớp mẫu" chỉ đơn giản là không tồn tại trong Tiêu chuẩn C ++. Đó là một thuật ngữ được sử dụng hầu hết bởi những người nghĩ rằng thuật ngữ "mẫu lớp" là khó hiểu (như các công ty Qt Nokia và trước đây là Trolltech).
Tiêu chuẩn không có khái niệm về nó, vì vậy những người khác có thể tạo ra sự khác biệt. Một số người sử dụng nó một cách đồng nghĩa và những người khác nói rằng thuật ngữ "lớp mẫu" đề cập đến một mẫu lớp được khởi tạo hoặc chuyên biệt rõ ràng, điều này sẽ làm cho nó tương đương với thuật ngữ "chuyên môn hóa mẫu lớp". Về mặt lịch sử, nó có ý nghĩa này. Các chú thích Reference Manual định nghĩa ở trang 343
Một lớp được tạo từ mẫu lớp được gọi là lớp mẫu, cũng như một lớp được xác định cụ thể với tên-lớp mẫu như tên của nó
Tên -lớp mẫu không phải đầu cuối tương đương với id khuôn mẫu không phải đầu cuối được sử dụng trong Tiêu chuẩn ngày nay và đi xuống template-name < arguments >.
Để bạn làm quen với các thuật ngữ ngày nay, điều này quan trọng hơn việc sử dụng các thuật ngữ cũ không rõ ràng
// (1) defines a class template
template<typename T> class A { };
// (2) defines a class template explicit specialization
template<> class A<int> { };
// (3) defines a class template partial specialization
template<typename T> class A<T*> { };
// (4) explicitly instantiates A<char>.
template class A<char>;
// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
Một lớp mẫu có liên quan đến mẫu thiết kế Phương pháp Mẫu , trong khi mẫu lớp chỉ là một mẫu lớp "điền vào chỗ trống".
Mẫu lớp là mẫu được sử dụng để tạo các lớp trong khi lớp mẫu là lớp được tạo bởi mẫu.
Lớp mẫu: Lớp có định nghĩa chung hoặc lớp có các tham số không được khởi tạo cho đến khi thông tin được cung cấp bởi máy khách. Nó được dùng để chỉ một biệt ngữ cho lớp template.simply đơn giản với mẫu tiền tố và sử dụng T. Mẫu lớp: Cấu trúc riêng lẻ của một lớp được chỉ định bởi một mẫu lớp gần giống như cách các đối tượng riêng lẻ được xây dựng bằng cách sử dụng một lớp. Nó được tham chiếu đến một đối tượng của lớp mẫu Ex- classname objectname (danh sách đối số)
Mẫu lớp là một lớp chung cho các loại đối tượng khác nhau. Về cơ bản, nó cung cấp một đặc tả để tạo các lớp dựa trên các tham số. Bất cứ khi nào một đối tượng mới được tạo, một lớp mới sẽ diễn ra trong bộ nhớ cho mục đích đó. Điều này được gọi là khởi tạo một mẫu lớp và mỗi phiên bản khởi tạo của lớp được gọi là lớp mẫu.
Hãy xem bài báo này (từ wg21 và được xuất bản năm 1992) :
Thuật ngữ nhất quán
Cho đến nay, phần lớn tranh luận và bất đồng liên quan đến thuật ngữ được sử dụng trong chương mô tả các mẫu. Thường xuyên nhất là ứng dụng khác nhau của 'function-template' và 'template-function' để thể hiện những ý tưởng và ý định khác nhau. Vì không có cách đặt tên nhất quán nào được áp dụng, kết quả là gây nhầm lẫn và tranh cãi.
Đối với mục đích của tài liệu này, như một đề xuất để ủy ban chính thức thông qua trong các cuộc thảo luận về các mẫu và nhằm mục đích làm rõ tài liệu; Tôi đề xuất chúng ta nên áp dụng phương thức chính thức hóa, rằng '-template' ở cuối mô tả một tập hợp các loại hoặc chức năng được mô tả bởi một mẫu. Và rằng một 'mẫu-' đứng đầu , được sử dụng để mô tả định nghĩa mẫu của một phần của '-template' , chẳng hạn như a
'template-member-function'. Như vậy: -
- 'function-template': Một tập hợp các chức năng được mô tả bởi một mẫu, tham số trên một số thông tin loại được cung cấp làm đối số cho mẫu đó. Ví dụ :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
- 'class-template': Một tập hợp các lớp được mô tả bởi một mẫu, tham số trên một số thông tin kiểu được cung cấp làm đối số cho mẫu đó. Ví dụ :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
- 'template-function': Thuật ngữ này không còn được phép nữa. **
'template-class': Thuật ngữ này không được phép. **
'member-function-template': Thuật ngữ này không được phép, vì nó mô tả thuộc tính hiện không được định nghĩa mẫu hỗ trợ. Sử dụng quy ước thuật ngữ ở trên, điều này sẽ mô tả một thành viên của một khuôn mẫu không phải lớp, mà định nghĩa của bản thân nó là một khuôn mẫu. Ví dụ :-
class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};
Tuy nhiên, vì các mẫu hiện bị giới hạn trong phạm vi toàn cầu, nên mẫu như vậy không hợp lệ.
- 'template-static-member-function':
- 'template-member-function':
- 'template-static-member':
- 'template-static-data-member ' template-member ': Các thuật ngữ thay thế cho định nghĩa của một thành viên có vẻ tách biệt với' mẫu lớp 'mà nó thuộc về. Ví dụ :-
template<class T> int S<T>::sep_member()
{ return i; }
Normallớp bạn mô tả ở trên: Tôi không biết rằng một khuôn mẫu-hàm-thành viên như vậy bị cấm. Nó được chấp nhận bởi tất cả các trình biên dịch mà tôi đã thử. Tôi đang thiếu gì?