c++中指向模板基类型的可重用指针
Re-usable pointer to template base type in C++
我有一个参数化的纯虚基类,其唯一目的是充当派生类的接口:
template <typename T>
class Base {
public:
virtual T get() = 0;
};
然后,我有具体的子类,它们本质上是工厂。每个返回一个不同类型的对象:
class DerivedOne : Base< vector<int> > {
public:
// ctors, etc.
vector<int> get();
};
class DerivedTwo : Base< map<double> > {
public:
// ctors, etc.
map<double> get();
};
到目前为止,一切顺利。但是在客户端代码中,我想使用指向基类的指针,并使用它从派生类创建对象。下面是一个例子:
Base* creator;
vector<int> stuffOne;
map<double> stuffTwo;
creator = new DerivedOne();
stuffOne = creator->get();
delete creator;
creator = new DerivedTwo();
stuffTwo = creator->get();
delete creator;
但是这不起作用,因为如果不指定参数类型,就不能有指向参数化类型的指针。因此,creator
可以是Base< vector<int> >*
或Base< map<double> >*
,而不仅仅是Base*
。
这违背了使用指针和分配/取消分配派生对象的全部目的。(您可以猜到,现实世界中的派生对象占用大量内存,因此在运行时销毁它们是可取的。)
有人有什么建议吗?我看了一下抽象工厂,但它们并不能完全满足我的需求。我明确地设置了这个,这样客户端代码就不会比现在更复杂了。
编辑:我试图避免的是每个派生类使用不同的指针。这将与现在的代码一起工作:
DerivedOne* d1 = new DerivedOne();
stuffOne = d1->get();
delete d1;
DerivedTwo* d2 = new DerivedTwo();
stuffTwo = d2->get();
delete d2;
…但是如果可能的话,我想尽量避免。
回答我自己的问题:没有办法做到这一点。我必须为每个派生类使用单独的指针。
共识似乎是我需要创建一个工厂。也就是说,我有一个工厂类,它的方法返回不同的数据类型和容器类型,而不是DerivedOne和DerivedTwo。
相关文章:
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?