0

スーパークラスのtype_infoが何であるかを確認する方法はありますか?私のシステムでは、オブジェクトはビットのセットによって識別されます。これはtype_infoハッシュコードによって識別されます。私のシステムがそれらが同じビットの下にあると考えるという意味で、これらのタイプのいくつかがポリモーフィズムを可能にすることを望みます。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();

したがって、私はインスタンスを使用していません。そして、私は現在のシステムをロックしたままにしておきたいです。

4

2 に答える 2

1

私が知っている自動の方法はありません。しかし、私があなたを理解しているのであれば、それは少しの追加の努力で行うことができます。

'base'クラスごとに、それ自体を参照するtypedefを追加し、代わりにそれを使用しますtypeid()。サブクラスはそれをオーバーライドすることを選択できることに注意してください。そうすると、自分のIDを取得し、子供は自分の値を使用します。

まったく使用したくない場合の別の解決策はtypeid()、ベースの適切な値を返す静的メンバー(またはメンバー関数)をベースクラスに配置し、それを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";

}

http://ideone.com/6ad08

于 2012-07-27T21:49:06.520 に答える
0

派生クラスによって変更されない変数を基本クラスに作成しないのはなぜですかISomeInterFaceComponent(特に必要な場合を除く)。タイプに基づいて変化させるのではなく、派生クラスのタイプに関係なくビット値を同じにしたいので、ポリモーフィズムが必要なようには聞こえません。将来、特定の派生型の場合にオーバーライドする必要がある場合でも、そのクラスに対して特別にこれを行うことができます。

あるいは、int(ビット値-またはこれが実際にあるタイプ)を返す基本クラスで仮想関数を使用し、基本と同じビット値にしたい派生クラスでそれをオーバーライドしないようにすることもできます。

例えば

 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.
 };
于 2012-07-27T21:05:52.167 に答える