Получите класс шаблона из себя в C ++ - PullRequest
6 голосов
/ 24 января 2012

В части унаследованного кода, с которой меня попросили работать, я натолкнулся на концепцию, которую я не понимаю. Поиск в SO и поиск в Google не совсем помогли, поэтому этот вопрос.

Существует класс шаблона, который выглядит следующим образом:

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 ]

3 голосов
/ 24 января 2012

Я не могу ничего сделать из вашего конкретного примера, но в целом это рекурсивный шаблон класса. Вокруг Index_t = x должна быть специализация, которая прервала бы рекурсию.

Вторым компонентом здесь является частное наследство, которое можно рассматривать как форму композиции . В сочетании с рекурсивным шаблоном вы можете использовать его для создания класса переменных размеров, например вектора определенного размера.

2 голосов
/ 24 января 2012

Обратите внимание:

template<int Index_t, int Kind_t, ProtocolType Prot_t, class Protocol>
class CommandHandlerGeneric 
    : private CommandHandlerGeneric<Index_t-1, Kind_t, Prot_t, Protocol>

Первый параметр шаблона изменен. Это больше не тот же класс. Шаблон класса не является полным классом, пока не указаны все параметры.

Действительно, незаконно наследовать от одного и того же шаблона класса и передавать тот же набор параметров, но здесь это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...