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ì?
* Cần có chuyên môn cho Index_t = 0 * hoặc một số giá trị khác –
Phải, đã thay đổi điều đó. –
Rất cám ơn các bạn! – Somesh