2012-01-24 25 views
6

Trong một phần mã cũ mà tôi đã được yêu cầu làm việc, tôi đã bắt gặp một khái niệm mà tôi không hiểu. Tìm kiếm trong SO và googling đã không hoàn toàn giúp đỡ, do đó câu hỏi này.Phát sinh một lớp mẫu từ chính nó trong C++

Có một lớp mẫu trông như thế này:

template<int Index_t, int Kind_t, ProtocolType Prot_t, class Protocol> 
class CommandHandlerGeneric 
    : private CommandHandlerGeneric<Index_t-1, Kind_t, Prot_t, Protocol> { 
public: 
    CommandHandlerGeneric(Protocol& Shared, CmdHandlerBase** Cont) : 
     CommandHandlerGeneric<Index_t-1, Kind_t, Prot_t, Protocol>(Shared, Cont) {} 
}; 

Lớp CmdHandlerBase là một lớp không mẫu mà tồn tại ở đâu đó trong một tiêu đề khác nhau. Theo định nghĩa ở trên, có macro trông giống như sau:

#define REGISTER_COMMAND_HANDLER_BASE(CmdIndex, CmdType, CmdKind, ProtType) \ 
    template<class Protocol> \ 
    class CommandHandlerGeneric<CmdIndex, CmdKind, ProtType, Protocol> 
     : private CommandHandlerGeneric<CmdIndex-1, CmdKind, ProtType, Protocol> \ 
    { \ 
     CmdType m_Cmd;\ 
    public: \ 
     CommandHandlerGeneric(Protocol& Shared, CmdHandlerBase** Cont) : \ 
     m_Cmd(Shared), \ 
     CommandHandlerGeneric<CmdIndex-1, CmdKind, ProtType, Protocol>(Shared, Cont) \ 
     { Cont[CmdIndex] = &m_Cmd; } \ 
    }; 

Có vẻ như macro trên một phần chuyên về mẫu lớp CommandHandlerGeneric. Điều này có đúng không? Lý do đằng sau việc tạo ra một lớp học riêng tư từ chính nó là gì?

Trả lời

3

Tôi thực sự không thể làm bất cứ điều gì trong ví dụ cụ thể của bạn, nhưng nói chung, đó là một mẫu lớp đệ quy. Nên có một chuyên môn xung quanh cho Index_t = x, điều này sẽ chấm dứt sự đệ quy.

Thành phần thứ hai ở đây là thừa kế riêng tư, có thể được coi là form of composition. Kết hợp với mẫu đệ quy, bạn có thể sử dụng mẫu này để tạo một lớp có kích thước biến, ví dụ: vectơ của một thứ nguyên nhất định.

+3

* Cần có chuyên môn cho Index_t = 0 * hoặc một số giá trị khác –

+0

Phải, đã thay đổi điều đó. –

+0

Rất cám ơn các bạn! – Somesh

2

Lưu ý này:

template<int Index_t, int Kind_t, ProtocolType Prot_t, class Protocol> 
class CommandHandlerGeneric 
    : private CommandHandlerGeneric<Index_t-1, Kind_t, Prot_t, Protocol> 

Tham số mẫu đầu tiên được thay đổi. Nó không còn là lớp học nữa. Một mẫu lớp không phải là một lớp hoàn chỉnh cho đến khi tất cả các tham số được chỉ định.

Thật vậy, bất hợp pháp để kế thừa từ cùng một mẫu lớp và chuyển cùng một tập hợp các tham số, nhưng đó không phải là trường hợp ở đây.

+0

Cảm ơn bạn đã chỉ ra điều đó. Tuy nhiên, tại sao mọi người lại muốn làm một điều như vậy? Mục đích của nó là gì? – Somesh

+1

@Somesh: Đó là một số công cụ chuỗi tôi đoán, không thể nói mà không đào sâu vào mã. – sharptooth

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