从模板类继承而不知道类型的c++类

C++ Class inheriting from template class without knowing the type?

本文关键字:类型 c++ 不知道 继承      更新时间:2023-10-16

我正在设计一个模板类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) {}:
};

问题是,当定义这些类时,我不知道它们将为基模板类使用什么类型。这可能吗?我希望从继承的类构造函数(可能是模板化的)获得类型,然后将其传递给基类构造函数。我可以这么做吗?如果是,怎么做?类型定义枚举?我看到过这个问题,但在我看来它并没有真正回答这个问题。

让它们成为模板类:

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

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

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


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

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

那么所有的派生类都可以访问这些状态的公共接口