【问题标题】:C++ Class inheriting from template class without knowing the type?C++ 类从模板类继承而不知道类型?
【发布时间】:2011-10-04 00:39:42
【问题描述】:

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

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

【问题讨论】:

    标签: c++ class templates inheritance


    【解决方案1】:

    使它们成为模板类:

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

    【讨论】:

    • 谢谢,我的印象是模板类不能从模板类继承,还是只有基类有虚拟?
    • @Alex:我的模板类只是一个普通的类,一旦你给它模板参数。
    【解决方案2】:

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

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


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

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

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

    【讨论】:

    • 这很糟糕吗?它会膨胀可执行文件吗?
    • 完全取决于你想要达到的目标。模板和继承是一种正交的概念。模板是类型通用的,“并行”工作并且彼此看不到,而继承是类型固定的并且“下降”。如果您有重复模式,请使用模板;如果您有通用接口,请使用继承。
    • 好吧,在这种情况下,我想要一个可以工作的基类的组合,它是通用的(适用于多种类型),但可以从其他类继承。将这两者混合是不好的做法吗?
    • @Alex:让它以最干净的方式工作,然后担心性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2012-10-05
    相关资源
    最近更新 更多