4

構造体であるさまざまなタイプのコンポーネントがあるとしましょう。多分私は持っていTransformComponentますRigidBodyComponent

さて、これが問題ですstd::map。コンポーネントのタイプと id をコンポーネントにマップする場所のようなものが必要です。ID はコンポーネントをリンクするものです。これにはどのような容器を使用すればよいですか? std::map<std::typeindex, std::map<id_t, T>>タイプTは、最初のマップのインデックスに使用する typeindex に依存するため、使用できません。

4

4 に答える 4

1

あなたのユースケースは、ポリモーフィズムの典型的な使用法のように聞こえます。「非同種」の型を単一のコンテナーに格納しようとすると、ポリモーフィズムのパフォーマンスが低下することを知っておく必要があります。C++ が提供する「すぐに使える」ポリモーフィズムを使用するか、カスタム ソリューションを使用するかは、完全にあなた次第です。

ところで、質問のコメントから質問の1つを引用するには:

そのようなコンテナを持つことができるとします。あなたはそれで何をしますか?意図した使用例をいくつか示してもらえますか?

これは非常に良い質問です。なぜなら、あなたの特定の使用シナリオを明らかにすることで、他の人があなたの質問にもっと詳しく答えることができるからです。したがって、さらにガイダンスが必要な場合は、質問を明確にして構築する必要があります。

于 2013-10-02T08:40:06.703 に答える
0

したがって、古い C ハッキングを使用するカスタム コンテナーを作成することを気にしない場合は、これを解決できます。

ここに例を書きました:

#include <iostream>

using namespace std;

struct ent
{
    int myInt;
};

struct floats
{
    float float1;
    float float2;
};

struct container
{
    bool isTypeFloats;

    union
    {
        ent myEnt;
        floats myFloats;
    };
};

void main( void )
{
    ent a = { 13 };
    floats b = { 1.0f, 2.0f };
    container c;
    container d;

    cout << b.float1 << " " << b.float2 << endl;

    c.isTypeFloats = false;
    c.myEnt = a;

    d.isTypeFloats = true;
    d.myFloats = b;

    //correct accessor
    if( c.isTypeFloats )
    {
        cout << c.myFloats.float1 << " " << c.myFloats.float2 << endl;
    }
    else
    {
        cout << c.myEnt.myInt << endl;
    }

    if( d.isTypeFloats )
    {
        cout << d.myFloats.float1 << " " << d.myFloats.float2 << endl;
    }
    else
    {
        cout << d.myEnt.myInt << endl;
    }
}

これらの構造体をコンテナーに入れるには、次のようにします。std::vector< container >

これについて知っておくべきことがいくつかあります。

  1. ユニオンは最大の型にスペースを割り当てます。したがって、私の例では、int が 4 バイト、float が 4 バイトの場合、 を格納しているときでも にentスペースが割り当てられるため、floatsを格納するたびに 4 バイトが無駄になりますent。アプリケーションの目的と保存する型のサイズによっては、これは無視できる場合があります。
  2. 保存している型のサイズに大きな違いがある場合は、C++ が内部でユニオンを実際に処理している方法でこれを行うことができます。そして、それはを使用することvoid*です。したがってstd::vector< void* > myVec、次のように挿入します: myVec.push_back( &x )where xis your type, たとえばentfrom our example. しかし、それを読むと、自分が何を指しているのかを知る必要があるため、次のようなことを行う必要があります。cout << ( ( ent* )myVec[0] )->myInt << endl;
  3. 事前定義された書き込みパターンがない限り、おそらくそれがどのタイプであるかがわからないため、おそらく次のようなコンテナー構造体を使用したくなるでしょう。

    struct container2 { bool isTypeFloats; void* myUnion; }

于 2013-10-02T11:39:36.277 に答える
0

boost::any または boost::any_cast はどうですか??

http://www.boost.org/doc/libs/1_54_0/doc/html/any.html

于 2013-11-07T10:42:39.110 に答える