En una parte del código heredado con el que me pidieron que trabaje, me encontré con un concepto que no entiendo. La búsqueda en SO y en Google no ayudó del todo, de ahí esta pregunta.Derivar una clase de plantilla de sí mismo en C++
Hay una clase de plantilla que tiene este aspecto:
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) {}
};
La clase es una clase CmdHandlerBase
no molde que existe en un encabezado diferente en otro lugar. Siguiendo la definición anterior, existe una macro que tiene este aspecto:
#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; } \
};
se parece a la macro anterior se especializa en parte la plantilla de clase CommandHandlerGeneric
. ¿Es esto correcto? ¿Cuál es la razón detrás de derivar una clase en privado de sí mismo?
* Debería haber una especialización alrededor de Index_t = 0 *, o algún otro valor –
Right, cambió eso. –
Muchas gracias chicos! – Somesh