带有接口对象的C++模板

Rya*_*yan 7 c++ inheritance templates

我有以下不编译的代码.

class Base {
    public:
        virtual ~Base() { };
};

class Derived : public Base { };

class NotDerived { };

template <typename T>
class Group { };

int main() {
    Group<Base> *g = NULL;

    g = new Group<Base>();       // Works
    g = new Group<Derived>();    // Error, but I want it to work

    g = new Group<NotDerived>(); // Error, as expected
}
Run Code Online (Sandbox Code Playgroud)

我知道这不会编译,因为它g是一种不同的类型Group<Derived>.为了在Java中工作,我会做一些事情Group<? extends Base> g,但据我所知,C++没有那个关键字.可以做些什么?

编辑:我想澄清,我不希望它可以设置不从派生类型Baseg.我已经更新了我的例子来解释这一点.

编辑2:我的问题有两个解决方案. 戴夫的发现简单易行.但Bowie(以及Mark的补充)更能满足我的需求.

Ker*_* SB 5

这些类Group<Base>Group<Derived>完全不相关的,不同的班级.指向它们的指针在任何一个方向都不可转换.

如果需要运行时多态行为,则类模板Group可以从公共(非模板化)基类派生:

class Group // base
{
   virtual ~Group() { }
};

template <typename T>
class ConcreteGroup : public Group
{
  // ...
  T * m_impl;
};

Group * g1 = new ConcreteGroup<A>;
Group * g1 = new ConcreteGroup<B>;
Run Code Online (Sandbox Code Playgroud)


Bow*_*ens 3

您可以使 Group<Base> 成为所有 Group<T>T!=Base 的基类。

class Base {
    public:
        virtual ~Base() { };
};

class Derived : public Base { };


template <typename T> class Group;

struct Empty { };

template <typename T>
struct base_for_group_t {
    typedef Group<Base> type;
};

template <>
struct base_for_group_t<Base> {
    typedef Empty type;
};

template <typename T>
class Group : public base_for_group_t<T>::type { };

int main() {
    Group<Base> *g = 0;

    g = new Group<Base>();    // Works
    g = new Group<Derived>(); //  now works
}
Run Code Online (Sandbox Code Playgroud)