CG プロジェクトにメッシュ クラスを実装したいのですが、いくつかの問題が発生しました。私がやりたいのは、実装の詳細 (特定の API へのロードなど: OpenGL、DirectX、CUDA など) をユーザーから隠す Mesh クラスです。さらに、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;
};
};
柔軟性のために、各メッシュは実際には、メッシュのいくつかの側面を記述する 1 つの位置チャネル、通常チャネルなどのチャネルのコレクションです。チャネルは、いくつかの機能が追加された std::vector のラッパーです。
実装の詳細を非表示にするために、API 固有のコードを処理する各 API (OpenGLMesh、DirectXMesh、CUDAMesh、...) の派生クラスがあります。同じことがチャネル (API へのチャネル データのロードを処理する OpenGLChannel など) にも当てはまります。メッシュは、Channel オブジェクトのファクトリとして機能します。
ただし、ここに問題があります。チャネルはテンプレート クラスであるため、createChannel はテンプレート メソッドである必要があり、テンプレート メソッドは仮想化できません。私が必要とするのは、テンプレート化されたオブジェクトを作成するためのファクトリー パターンのようなものです。同様のことをどのように達成できるかについて、誰かアドバイスがありますか?
ありがとう