3

リソースローダーを作成しようとしていますが、クラスリソースとテンプレートクラスリソースマネージャーが必要です。さまざまなタイプのリソースが基本リソースクラスから継承されます。たとえば、画像、3Dメッシュなどです。

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

そのため、テンプレート化されたresourceManagerクラスを使用する予定でした。

次に、次のようなリソースマネージャーを作成できます。

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

リソースマネージャーは、基本リソースクラスではなく、リソースタイプのポインターを返します。そうすれば、各リソースタイプに固有の関数を呼び出すことができます。

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

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

 resourceManager<int> resManInts();

リソースマネージャが基本リソースクラスの関数を呼び出すことができる必要がある場合を除いて、これは問題ありません。たとえば、基本リソースクラスにはファイルからロードするための仮想関数がありますが、リソースマネージャーは、テンプレートとして何でも渡すことができ、intまたはstringまたはloadFromFile( )。

基本クラスを使用してテンプレートを指定して何かを行うことを考えていましたが、派生クラスごとに特殊化しない限り、派生クラスではなく基本クラスのポインターが返されますが、テンプレートがない場合もあります。クラスですが、代わりにタイプごとにリソースマネージャークラスがあります。

では、基本クラスの関数にアクセスしながら、テンプレートを使用して派生クラスの関数を呼び出すという利点を活用する方法はありますか?

4

2 に答える 2

1

はい、テンプレート パラメーターを特定のクラスの子孫に制限することができます。この回答を参照してください。

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

于 2012-04-05T13:42:40.607 に答える
1

与えられたすべてのタイプに「loadFromFile()」メソッドがあると予想される場合は、テンプレートでこのメソッドを使用するだけです。誰かがテンプレート引数「int」としてあなたに与えた場合、それはコンパイルされません。私が理解できる限り、これは問題ありません。

与えられたすべてのタイプが持っていると予想されるインターフェースを文書化するだけです(たとえば、「loadFromFile()メソッドを持っている」)。

于 2012-04-05T13:43:11.307 に答える