在C ++中从自身派生模板类

时间:2012-01-24 08:18:15

标签: c++ templates inheritance

在我被要求使用的遗留代码的一部分中,我遇到了一个我不理解的概念。搜索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。它是否正确?从自己私下衍生课程背后的理由是什么?

2 个答案:

答案 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>

第一个模板参数已更改。它不再是同一个班级了。在指定所有参数之前,类模板不是完整的类。

实际上,从同一个类模板继承并传递相同的参数集是非法的,但这并非如此。