不知道类型的情况下继承模板类的C++类?

8

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

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

15

将它们变成模板类:

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

谢谢,我原本以为一个模板类不能从另一个模板类继承,或者只有在基类有虚函数的情况下才能这样做? - Ælex
1
@Alex:模板类只是普通类,一旦你给它传递模板参数。 - GManNickG

1

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

将模板视为代码生成工具。它们不会创建“类型通用类型”,而是在编译时遵循通用模式创建许多平行的具体静态类型实例


如果你真的想要一个单一的通用基础类型,也许你可以将state的类型变成多态的:

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

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


那这样做不好吗?会让可执行文件变得臃肿吗? - Ælex
2
这完全取决于你想要实现什么。模板和继承是有点正交的概念;模板是类型通用的,可以“并行”工作而且彼此不可见,而继承则是类型固定的并且是“向下”的。如果你有一个重复的模式,请使用模板;如果你有共同的接口,请使用继承。 - Kerrek SB
在这种情况下,我想要一个组合,即一个可以工作的基类,它将是通用的(适用于许多类型),但也可以从其他类继承。将这两者混合使用是否是不良实践? - Ælex
@Alex:以最干净的方式让它正常工作,然后再考虑性能。 - GManNickG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接