我想为一个 CG 项目实现一个 Mesh 类,但遇到了一些问题。我想要做的是一个 Mesh 类,它向用户隐藏实现细节(比如加载到特定的 API:OpenGL、DirectX、CUDA、...)。此外,由于 Mesh 类将用于研究项目,因此该 Mesh 类必须非常灵活。
class Channel {
virtual loadToAPI() = 0;
}
template <class T>
class TypedChannel : public Channel {
std::vector<T> data;
};
template <class T>
class OpenGLChannel : public TypedChannel<T> {
loadToAPI(); // implementation
};
class Mesh {
template<class T>
virtual TypedChannel<T>* createChannel() = 0; // error: no virtual template functions
std::vector<Channel*> channels;
};
class OpenGLMesh {
template<class T>
TypedChannel<T>* createChannel()
{
TypedChannel<T>* newChannel = new OpenGLChannel<T>;
channels.push_back(newChannel);
return newChannel;
};
};
出于灵活性考虑,每个 Mesh 实际上是通道的集合,如一个位置通道、一个普通通道等,它们描述了网格的某些方面。通道是 std::vector 的包装器,具有一些附加功能。
为了隐藏实现细节,每个 API(OpenGLMesh、DirectXMesh、CUDAMesh、...)都有一个派生类,用于处理特定于 API 的代码。通道(处理将通道数据加载到 API 的 OpenGLChannel 等)也是如此。Mesh 充当 Channel 对象的工厂。
但是问题来了:由于Channels是模板类,createChannel必须是模板方法,模板方法不能是虚的。我需要的是用于创建模板对象的工厂模式。有没有人对如何完成类似的事情有建议?
谢谢