2012-01-24 13 views
6

従来のコードの一部で、私が作業を依頼された部分で、わかりません。 SOでの検索やグーグルではあまり役に立ちませんでした。C++でテンプレートクラスを派生させる

次のようになりますテンプレートクラスがあります:

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を専門とするように見えます。これは正しいです?自分自身からクラスを個人的に派生させる根本的な理由は何ですか?

答えて

3

具体的な例は実際にはできませんが、一般的に再帰的なクラステンプレートです。再帰を終了するIndex_t = xの周りの専門化があるはずです。

第2の成分は私的継承で、これはform of compositionと考えることができます。再帰的テンプレートと組み合わせると、これを使用して、たとえばある次元のベクトルなど、可変サイズのクラスを作成できます。

+3

* Index_t = 0 *、または他の値の特殊化があるはずです –

+0

右に変更しました。 –

+0

多くのありがとうございます! – Somesh

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> 

最初のテンプレートパラメータが変更されます。もはや同じクラスではありません。すべてのパラメータが指定されるまで、クラステンプレートは完全なクラスではありません。

実際、同じクラスのテンプレートを継承し、同じセットのパラメータを渡すのは不正ですが、ここではそうではありません。

+0

これを指摘してくれてありがとう。しかし、なぜそんなことをしたいのですか?それは何の目的ですか? – Somesh

+1

@Somesh:それは私が推測している、コードに掘り下げることなく伝えることができない連鎖的なものです。 – sharptooth

関連する問題