2017-08-05 20 views
1

私は抽象コンポーネントクラスと、コンポーネントからなるベクトル(派生された可能性)を持つエンティティクラスを持っています。私はコンポーネントを参照できるようにしたい。それはタイプまたは文字列でそれらを見る方が良いですか?両方の場合においてタイプ別オブジェクトの検索vs文字列

ComponentA* component = entity.getComponent<ComponentA>(); 
// vs 
ComponentA* component = entity.getComponent("ComponentA"); 

私はvtableのが必要になりますが、唯一、後に私はすべての派生クラスのgetName機能のいくつかの並べ替えを実装する必要があります。

template<typename T> 
T * getComponent(); 

異なるT S、異なる戻り値の型と、あなたが正しい型の変数に直接返された値を割り当てることができます。

+0

あなたは 'template'で安全性を持っていますが、どのように文字列から(結果)型を知っていますか? – Jarod42

答えて

1

は、この宣言を考えてみましょう。
これはうまくいく可能性があります。ここまでは順調ですね。ご希望の場合は

?? getComponent(std::string); 

またはこの1:

は今、この宣言を検討

?? getComponent (const char *); 

戻り値の型がどうあるべきか?あなたができることは、共通の基本クラス(存在する場合)を使用して、毎回呼び出し元のコンテキスト内でそれをキャストすることです。私は実際にはもっと迷惑な何かを想像することはできません。
あなたの周りの他の方法はvoid *を返すことですが、私はそれをお勧めしません。
正しいタイプ(オーバーロードoperator()をテンプレートにする)を渡す呼び出し可能オブジェクトである2番目のパラメータを追加することもできますが、コールポイントではすべてが少し混乱します。
それ以外の場合は、関数をコール・ポイントで直接戻り値の型に設定するテンプレートにすることができますが...待機...最初のケースに向かわないのですか?私は、これはすでに最善の策だものを決定するのに十分であることを言うだろう

template<typename T> 
T * getComponent(); 

:、テンプレートパラメータを追加し、それは今で冗長だため、関数のパラメータを削除し、何を得ることです。