画像テンプレート クラスを作成したい。このクラスは、ファイルから画像データを読み取り、データをメンバー変数に格納します。画像のデータ型は画像のヘッダーに格納されており、事前にはわかりません。
画像のデータ型を知らずに画像テンプレート クラスを作成するにはどうすればよいですか? イメージ読み取り関数はヘッダーを読み取り、データのデータ型に応じてそのメモリを割り当てます。
ありがとう
テンプレートはこれを自動化するのにあまり役に立ちません。テンプレートを使用すると、型の (一部の) 特定の詳細の処理を、コードの作成時ではなくコンパイル時まで遅らせることができますが、コードのコンパイル時には、テンプレート パラメーターとして使用される型と値のすべての詳細を把握しておく必要があります。 . ここで扱っているように、実行時まで不明な型のバリエーションは特に扱いません。
あなたが話していることは、基本的な「Image」クラスと、各タイプの画像の派生クラス(BmpImage、JpegImage、TiffImageなど)を備えた、古典的なOOPモデルにより密接に適合するように聞こえます。 'データを読み取り、Image から派生した何らかのタイプのオブジェクトをインスタンス化し、最後にその新しく定義されたオブジェクトに を返す、ある種の ImageFactory クラスを用意してImage *
、クライアント コードが必要に応じて画像を表示、操作などできるようにします。 .
明らかな代替手段 (これも非常に広く使用されています) は、外部データを読み込み、その外部形式を統一された内部形式に変換し、その内部形式で画像を表すオブジェクトを作成することです。たとえば、Windows では、外部ファイルを読み取り、それらすべてを Windows ビットマップに変換できます。
型を動的に取得する限り、テンプレートを直接使用することはできません (テンプレートは静的ポリモーフィズムを実装します)。
すべてのタイプの画像がわかっている場合は、2 つのアプローチを組み合わせることができます。抽象クラスを宣言し、テンプレート クラス (ベースから派生) をこれらのタイプでインスタンス化し、一種のファクトリを使用して対応するクラスを作成します。
class base
{
public:
virtual int getWidth() = 0;
};
template <class T> class ImageOfSomeType : public base
{
public:
virtual int getWidth() { return width; };
};
// in a cpp file:
//The explicit instantiation part
template class ImageOfSomeType <MyType1>;
template class ImageOfSomeType <MyType2>;
そしてどこかで()
base * createImage()
{
...
if (image_type == "type1") return new ImageOfSomeType<MyType1>;
...
}