2016-05-09 4 views
0

私は、私のゲームエンジンにResourceManagerクラスを書く予定です。画像、音楽、モデルなどを簡単に管理できます。DLLクラスからテンプレート値を返す

クラスのようなもの:(それはその後、作品だけでどのように)

class ResoureManager{ 
std::map<cstring path,T> resources; 
public: 
<T> get(char path[]); 
} 

アイデアは簡単だった:大きな容器の中にすべてのものを保存して、パスを介してオブジェクトを返します。私の問題は今、テンプレート化されたコンテナでクラスを使用しなければならないので、将来的に必要なものを管理できます。ここで私の主な問題は、オブジェクトを返す必要がある::get(char path[])関数です。これまでのところ、私は輸出のためのいくつかのタイプを導入することができますが、私は取ることができる選択肢がありますか?

私はあなたが(タイプは「オンザフライ」で決定される)タイプTのオブジェクトを返すようにしたいように見えるMSVSコミュニティ2015

+0

あなたの(壊れた)コード例から、正確に何が欲しいのか明確ではありません。しかし、あなたは[Boost.Any](http://www.boost.org/doc/libs/1_59_0/doc/html/any.html)(あなたの 'T'の代わりになります)を異なるタイプのオブジェクトを格納する手段。あるいは、すべてのリソースを簡単に文字列表現に/から変換できる場合、[Boost.PropertyTree](http://www.boost.org/doc/libs/1_59_0/doc/html/property_tree.html)もまたオプション? – mindriot

答えて

0

を使用しています。それはテンプレートがC++で動作する方法ではありません。

テンプレートは、C++プログラムの他のすべてと同様に、の入力であり、コンパイラにはと入力されています。それはの数多くの種類のTと同じように多くの種類を作成します。 Tは、提供するtypenameのプレースホルダです。

getの機能は、のどのようなものでも、となります。これは古い問題です。古いものから、C++にはじめて継承、仮想関数、RTTIなどが焼き付けられました。古典的には、タイプを定義します - それをresource_tと呼びましょう - それからクラスを派生します。それぞれの派生クラスは同じ関数セットを実装します。 resource_t *mirabile dictuを保持するマップaを定義するには、ポインタを介して実際の(派生した)タイプに適した関数を呼び出します。これは、C++がオブジェクト指向の考え方多形を実装する方法です。

あなたが知っているかもしれないいくつかの動的言語とは異なり、C++では関数名からオブジェクト型への配線はすべてコンパイル時に決定されます。プログラムは、実行時に特定の機能が実装されていないことを検出しません。それはそこにあるか、それはコンパイルエラーです。

あなたが提供したスケッチを完成させようとすると、間もなくそれはコンパイルされず、暗黙のうちに動作するようにはできません。 C++にはあなたが望むことをするための仕組みがあります。私が推薦することができる最も良いことは、良い本であり、数時間でそれらの理解を発展させることです。

+0

この回答をお寄せいただきありがとうございます。私はそれがうまくいかないことを知っています、そして、私はこの話題に慣れています(はい、私は本当にあります)。いくつかの異なるテンプレートクラス(私のDLL内)では、これまでのインスタンス化を使用していました。私はそのようなことを実現する他の方法があるかどうか尋ねたがっています。 –

関連する問題