スーパークラスTYPE_INFOを再帰的にチェックしてください
-
12-12-2019 - |
質問
スーパークラスのType_infoが何のかを確認する方法はありますか? 私のシステムオブジェクトは一連のビットによって識別されます。これはType_Info HashCodeによって識別されます。私のシステムがそれらが同じビットの下にあると思うという意味で多型を有効にするには、これらのタイプのいくつかが欲しいのですが。TYPE_INFOクラスタイプごとに一意のハッシュコードを作成します。代わりに、派生クラスにスーパークラスのビットセットをそのようにビットセットすることをお勧めします。
Component > ISomeInterfaceComponent -> bit = 00001
|
\ ComponentContextA -> bit = ISomeInterFaceComponent bit
|
\ ComponentContextB -> bit = ISomeInterFaceComponent bit
|
\ ComponentContextC -> bit = ISomeInterFaceComponent bit
.
これは、処理のためにコンポーネントを含むオブジェクトを1つのシステムに追加する必要があります。
今の時点でこれは起こったことです:
Component > ISomeInterFaceComponent -> bit = 00001
|
\ ComponentContextA -> bit = 00010
|
\ ComponentContextB -> bit = 00100
|
\ ComponentContextC -> bit = 01000
.
どのコンポーネントに異なるシステムを作成する必要があります。
誰かが私がこれを達成できる方法についてポインタを与えることができるならば、それは素晴らしいでしょう。
編集: 混乱を防ぐために、それは次のようになります。 ComponentTypeManager :: getBit();
だから私はインスタンスを扱いません。そして私は現在のシステムをロックに保存したいと思います。
解決
私が知っている自動的な方法はありません。しかし、私があなたを理解しているならば、それはほとんど追加の努力を踏まえて行うことができます。
あなたのベースのクラスのそれぞれの場合は、それ自体を参照するTypedefを追加し、代わりにtypeid()
で使用します。注サブクラスはそれを上書きすることを選択できます。彼らがそうするならば、彼らは彼ら自身のIDを得るでしょう、そして彼らの子供たちは価値を使うでしょう。
注意してください。getBit()関数
#include <iostream>
#include <iomanip>
#include <typeinfo>
struct Base1
{
typedef Base1 Base;
};
struct Base2
{
typedef Base2 Base;
};
struct Derived1A : public Base1 { };
struct Derived1B : public Base1 { };
struct Derived2A : public Base2 { };
struct Derived2B : public Base2 { };
template <typename T>
std::size_t getBit()
{
// Do whatever you normally do here, but use T::Base instead of T
return std::hash<std::string>()(typeid(typename T::Base).name());
}
int main()
{
std::cout << std::boolalpha << getBit<Derived1A>() << " == " << getBit<Derived1B>() << " " << (getBit<Derived1A>() == getBit<Derived1B>()) << "\n";
std::cout << std::boolalpha << getBit<Derived2A>() << " == " << getBit<Derived2B>() << " " <<(getBit<Derived2A>() == getBit<Derived2B>()) << "\n";
}
.
他のヒント
基本クラスISomeInterFaceComponent
で変数を作成するだけではない(特に望んでいない限り)。タイプに基づいて変わるのではなく、派生クラスタイプに関係なく、ビット値が同じになるように、多態性が望ましいように、あなたが多態様を望むように聞こえません。将来、特定の派生型の場合は上書きする必要がある場合は、まだそのクラスのためにこれを特別にすることができます。
あるいは、基本クラスで仮想関数を使用する(ビット値 - またはこれが実際にあるタイプでは)、単に同じビット値を持つ派生クラスでそれを上書きしないでください。ベース。
例えば
です class ISomeInterFaceComponent {
virtual int GetBit() { return 1;}; // return bit value
};
class ComponentContextA : public ISomeInterFaceComponent {
// Do not override GetBit() - let the base class function get called.
};
.