gpt4 book ai didi

带有接口(interface)对象的 C++ 模板

转载 作者:可可西里 更新时间:2023-11-01 18:26:49 24 4
gpt4 key购买 nike

我有以下无法编译的代码。

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
}

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

编辑:我想澄清一下,我不希望将不是从 Base 派生的类型设置为 g 。我已经更新了我的例子来解释这一点。

编辑 2:我的问题有两种解决方案。 Dave's 我发现它很简单,也很容易定义。但是 Bowie's(连同 Mark's 添加项)更适合我的需求。

最佳答案

Group<Base>Group<Derived>是完全不相关的,不同的类别。指向它们的指针在任何方向都不可转换。

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

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>;

关于带有接口(interface)对象的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7184183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com