C ++类继承自模板类而不知道类型?

时间:2011-07-12 21:34:10

标签: c++ class templates inheritance

我正在设计一个模板类策略,它需要能够处理指向其他类的指针。

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) {}:
};

问题是,在定义这些类时,我不知道它们将用于基本模板类的类型。这甚至可能吗? 我想要从继承的类构造函数(可能是模板化)获得的类型,然后将其传递给基类construtor。 我能这样做吗?如果有,怎么样? typedefining enums? 我见过this question,但在我看来,它并没有真正回答这个问题。

2 个答案:

答案 0 :(得分:15)

制作模板类:

template <typename P>
class Greedy : public Policy<P>
{
    // now you know
};

答案 1 :(得分:1)

你当然可以这样做(请参阅GMan对派生类型的正确参数化的答案),但请记住,对于每种类型P,您将获得完全独立的类层次结构。你并没有神奇地创建一个具有任意数量成员类型的超类。

将模板视为代码生成工具。它们不会创建“类型泛型类型”,而是在编译时按照通用模式创建大量具体的静态类型的并行实例


如果你真的想要一个单一的公共基类型,也许你可以使state多态的类型:

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

然后,所有派生类都可以访问状态的公共接口。