C++:相同的方法,不同的类,不能是虚拟的或继承的



假设我有三个非常不同的类,没有共同的父类:Camera, Light, Model。但这三个都有相同的通用SetPos(float x, float y, float z)方法来转换它们在3D空间中的位置。我也有一个引用列表(例如std::map),它存储指向所有三种类型void*的对象的指针——这意味着它是泛型和非描述性的。

总结一下:我有一堆相机,灯光和模型具有非常不同的数据结构,所有这些都可以使用SetPos方法移动,每个都有,我保留通用的,无类型void*指针指向所有它们在一个地图中快速访问。

我想知道的是,如果有可能以某种方式调用SetPos从一个void*没有确定类对象类型(例如,将其存储在std::map,然后使用它转换该void*到一个适当的类指针)?

有一些模板的想法吗?

或者我应该只是创建一个泛型接口类,它将有一个纯虚方法SetPos(x,y,z),并简单地使这三个类从它继承-并通过简单地将指针转换为单个类来完成它-但我宁愿避免这个选项,因为……原因,如果有更好的替代方法呢?

是的有一个模板,使用std::variant代替void*。我猜你的代码包含一些动态类型转换或更糟糕的已经与存储的对象进行交互。一般来说,这是糟糕的设计,类型系统是我们的朋友,类型不应该被轻易删除。

然后你可以做类似这样的事情:

std::variant<A,B,C> obj;
...
std::visit(obj,[&](auto& o){o.SetPos(x,y,z);};

最新更新