Класс C ++, наследующий от класса шаблона, не зная тип? - PullRequest
8 голосов
/ 13 июля 2011

Я разрабатываю шаблон класса Policy, который должен обрабатывать указатели на другие классы.

template <class P>
class Policy
{
  private:   
    const P *state;
  public:
    Policy (P const* s) : state(s){};
};

Это отлично работает. Теперь я хочу наследовать от вышеупомянутого шаблонного класса и создавать новые подклассы:

class Greedy : public Policy<???>
{
  public:
    template <typename P> Greedy (P const* s) : Policy(s) {}:
};

class Explora : public Policy<???>
{ 
  public:
    template <typename P> Explora (P const* s) : Policy(s) {}:
};

Проблема в том, что при определении этих классов я не знаю, какой тип они будут использовать для базового класса шаблона. Это вообще возможно сделать? Я хочу, чтобы тип был получен из унаследованного конструктора класса (возможно, на основе шаблона), а затем передал его основателю базового класса. Могу ли я сделать это ? Если да, то как? определения типов перечислений? Я видел этот вопрос , но, на мой взгляд, он не отвечает на этот вопрос.

Ответы [ 2 ]

15 голосов
/ 13 июля 2011

Сделайте им шаблон классов:

template <typename P>
class Greedy : public Policy<P>
{
    // now you know
};
1 голос
/ 13 июля 2011

Конечно, вы можете сделать это (см. Ответ GMan для правильной параметризации производного типа), но имейте в виду, что вы получите полностью независимые иерархии классов для каждого типа P.Вы волшебным образом не создаете суперкласс с произвольным числом типов элементов.

Рассматривайте шаблоны как инструмент генерации кода.Они не создают «тип-универсальный тип», а создают множество параллельных экземпляров конкретных статических типов во время компиляции по универсальному шаблону.


Если вы действительновам нужен один общий базовый тип, возможно, вы можете сделать тип полиморфным state:

class Policy // no template
{
  StateBase * state;
public:
  Policy(StateBase * s) : state(s) { }
};

Тогда все ваши производные классы смогут получить доступ к общему интерфейсу состояний.

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