模板、多态、抽象基类指针和运行时类型转换
Templates, polymorphism, abstract base class pointers and run-time casting
我想在游戏中实现一个Memento模式,以实现检查点。
我在游戏中有一个GameObject指针列表。GameObject是一个抽象类,由StaticObject、AnimatedObject等类实现。
我想让我的Memento类尽可能抽象,所以我已经模板化了我的整个Memento系统。
我的(为了调试的目的非常简单)Memento类是;
template<class T>
class Memento
{
public:
Memento() { }
Memento(T data)
{
setData(data);
}
void setData(T data)
{
//wanting this function to do complex behaviour
}
T _state;
};
我稍后会加入逻辑来区分T是不是指针。
_state需要是实际GameObject副本的指针,而不仅仅是指针本身的副本,因为这违背了Memento的目的。
我想在Memento模板中做的过程是;
1)传递一个指向抽象基类的指针
2)确定它指向的子类的类型(在运行时)。
3)在堆上创建一个新的子类,其指针为_state(从2中获得的类型)。
4)复制数据
我的问题是3。似乎没有办法获得适当的子类类型。
typeid(*data)和decltype(*data)返回对子对象的引用。如果我尝试使用auto,它也是一个参考。显然,我不能使用new和引用作为类型。
解决这个问题的方法显然是在Memento之外新建子类的副本并将其传递进去。但是,我很想知道是否有一种方法可以在运行时完全在Template类中完成。我已经试了好几个小时了,我倔强的一面不想放弃。
你要找的是"虚拟复制构造函数",或克隆,习惯用法。
class GameObject {
...
public:
virtual GameObject* clone() = 0;
};
class StaticObject : public GameObject {
...
public:
virtual StaticObject* clone() { return new StaticObject(*this); }
};
//..
相关文章:
- 通过switch和static_cast访问多态对象的运行时类型
- 通过引用传递参数时C++类型转换
- 是否可以在运行时强制转换模板参数?
- 如何在void*指针下检查运行时类型(允许简单类型,没有基类)?
- 获取派生模板实例化的运行时类型
- 运行时类型推断和代码重复
- UWP,加载窗口运行时组件 == 请求的窗口运行时类型 "..." 未注册
- 为什么C++不按运行时类型销毁对象?
- 编译时类型转换检查(constexpr和用户定义的文字)
- 运行时类型定义
- 在C++中如何将运行时类型鉴别器映射到模板实例(无需手动枚举所有实例)
- 编译器不可知的运行时类型信息
- 如何在模板中定义浮点常量.避免在运行时强制转换
- C++中高效的运行时类型检查
- 运行时类型信息的奇怪行为
- 运行时类型信息(为什么此代码不起作用)
- C++基于运行时类型实现强制转换
- 在运行时强制转换为派生类型
- 运行时类型在c++中的转换,如何
- 模板、多态、抽象基类指针和运行时类型转换