在我被要求使用的遗留代码的一部分中,我遇到了一个我不理解的概念。搜索SO和谷歌搜索没有太大帮助,因此这个问题。
有一个模板类如下所示:
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) {}
};
CmdHandlerBase
类是非模板类,存在于不同标头中的其他位置。按照上面的定义,有一个宏看起来像这样:
#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; } \
};
看起来上面的宏部分专门化了类模板CommandHandlerGeneric
。它是否正确?从自己私下衍生课程背后的理由是什么?
答案 0 :(得分:3)
我无法对你的具体例子做任何事情,但总的来说,这是一个递归的类模板。 Index_t = x
应该有一个专门化,它会终止递归。
这里的第二个成分是私有继承,可以被认为是form of composition。结合递归模板,您可以使用它来创建一个可变大小的类,例如某个维度的向量。
答案 1 :(得分:2)
请注意:
template<int Index_t, int Kind_t, ProtocolType Prot_t, class Protocol>
class CommandHandlerGeneric
: private CommandHandlerGeneric<Index_t-1, Kind_t, Prot_t, Protocol>
第一个模板参数已更改。它不再是同一个班级了。在指定所有参数之前,类模板不是完整的类。
实际上,从同一个类模板继承并传递相同的参数集是非法的,但这并非如此。