2

C++ で異なる型へのポインターのリストを実装する最良の方法は何でしょうか?

私はこのようなことを考えました:

enum MyType {...};
typedef std::pair<MyType, void*> Ptr;
std::vector <Ptr> list;

そして、リスト内のオブジェクトの 1 つにアクセスする必要があるとすぐに、適切な静的型キャストを実行します。

別のアプローチは、オブジェクトの種類ごとに異なるベクトルを持つことです。

std::vector<ClassA*> list_a;
std::vector<ClassB*> list_b;
...

問題は、すべての頂点が同じタイプではないグラフを実装する必要があることです。

編集。パフォーマンスは重要です。コードが効率的であるほど、優れています。

4

5 に答える 5

6

あなたの最善の解決策は、すべてのクラスが同じクラスから継承され、基本クラスへのポインターをリストに格納することです。void*最後の非常に非常に危険な解決策としてのみ使用してください。

于 2013-11-11T18:39:37.753 に答える
1

基準に応じて、次の 3 つのオプションがあります。

  1. void* ポインターを使用します。これは、コードの読者に「型情報が削除されている」ことを明示的に示しています。これはすべてのケースをカバーしますが、必要になる他の場所で型情報を取得できるようにするのは完全にあなた次第です。

  2. 侵入型ポリモーフィズムを使用して、このリストのメンバーシップに必要なクラスを定義し、それを指し示す必要がある任意のクラスに継承する必要があります。

    struct ListInterface { // struct for defaulting to public
        void Poke(uint addr, uint value) = 0;
        uint Poke(uint addr) const = 0;
    };
    
    class SplineVertex : public Vertex, public ListInterface {
        ...
    };
    
  3. 非侵入型ポリモーフィズムを使用して、メンバーシップを必要とする任意のクラスから派生クラスを作成します。

    struct ListInterface { // struct for defaulting to public
        void Poke(uint addr, uint value) = 0;
        uint Poke(uint addr) const = 0;
    };
    
    class SplineVertex : public Vertex {
        ...
    };
    
    class SplineVertexHolder : public SplineVertex, public ListInterface {
    };
    
于 2013-11-11T18:49:51.980 に答える