2012-04-05 21 views
2

私はリソースローダーを作成しようとしていますが、クラスリソースとテンプレートクラスのリソースマネージャが必要です。基本クラスとその派生クラスに限定されたC++テンプレート

任意のリソースタイプのマップを作成できますが、派生クラス固有の関数を呼び出すことができません。 3dMeshには画像にgetWidth()などのgetVertecies()が含まれている可能性があります。

このため、私はテンプレートのresourceManagerクラスを使用する予定でした。リソースマネージャは、リソースタイプではなく、ベースのリソースクラスのポインタを返す

resourceManager<3dMesh> resMan3DMeshes(); 
resourceManager<picture> resManPictures(); 

次に、あなたは次のようにリソースマネージャを作成することができます。そうすれば、各リソースタイプに固有の関数を呼び出すことができます。

pointerToMesh->getVerticies(); 
pointerToPicture->getWidth(); 

ただし、このアプローチを使用すると、のリソースマネージャを作るために何かを渡すことができます。

resourceManager<int> resManInts(); 

リソースマネージャが基本リソースクラスの関数を呼び出すことができることを除けば、これは問題ありません。例えば、基本リソースクラスはファイルからロードするための仮想関数を持ちますが、リソースマネージャはテンプレートとして何かを渡すことができないので、これらの関数を呼び出すことができません。intや文字列などはloadFromFile( )。

私は基本クラスでテンプレートの仕様を使って何かをしたいと考えていましたが、派生クラスごとに特殊化しない限り、基本クラスのポインタと派生クラスのポインタは返されますが、テンプレート化されたクラスはありませんが、代わりに各タイプのリソースマネージャークラスがあります。

テンプレートを使用して派生クラスの関数を呼び出す利点はありますが、基本クラスの関数にはまだ慣れていませんか?

+0

テンプレートがクラスメンバーを呼び出す場合、そのメンバーを持たないタイプでテンプレートをインスタンス化することはできません。それはコンパイルされません。 – sje397

+0

あなたの質問を解析するのに本当に問題があります。おそらく問題のドメイン言語のいくつかを除外できますか? –

答えて

1

テンプレートにこのメソッドを使用するよりも、与えられたすべての型が "loadFromFile()"メソッドを持つことが期待される場合は、誰かがあなたにテンプレート引数 "int"を渡すと、それはコンパイルされませんが、私が理解できる限り、これは誰かがそうするはずはありません。

あなたに与えられたすべての型が持つと期待しているインターフェースだけを文書化してください(例えば、 "loadFromFile()メソッドを持っている")。

+0

これは最も簡単な解決策のようです。 ありがとう:)私は、リソースマネージャが呼び出すすべての関数を実装する仮想基本クラスリソースがある場合、すべての派生クラスが仮想関数を上書きすることを確認し、それらの派生クラスのいずれかを使用することができますコンパイルエラーのないリソースマネージャ。 – jtedit

+0

@jteditコンパイル時にすべてが分かっていれば、仮想メソッドを持つ基本クラスは必要ありません。必要な場所に仮想メソッドを使用します(現時点または将来の機能強化のために)。 – selalerer

1

はい、テンプレートパラメータを特定のクラスの子孫に制限することは可能です。 see this answer.

また、そのままにしておくこともできます。リソースマネージャは、必要なインターフェイスを満たしていないテンプレートパラメータを使用してコンパイルに失敗します。

関連する問題