11

ジェネリックコンテナタイプを作成して、単一の共通インターフェイスを提供し、使用している内部コンテナは変更される可能性があるため非表示にしようとしています。

基本的に、アイテムのコレクションを返すプラグインがありますが、コードが使用しているコンテナーのタイプをプラグインに認識させたくありません。

誰かが私を以下のサンプルコードよりも良い方向に向けることができますか?

template<class C, typename I>
class Container
{
 public:
 //...

    void push(const I& item)
    {
        if(typeid(C) == typeid(std::priority_queue<I>))
        {
           std::priority_queue<I>* container = (std::priority_queue<I>*)&_container;
           container->push(item);
        }
        if(typeid(C) == typeid(std::list<I>))
        {
           std::list<I>* container = (std::list<I>*)&_container;
           container->push_back(item);
        }
        else
        {
           //error!
        }
     };

  private:
     C _container;
 //...
}

ありがとう

4

3 に答える 3

7

アイテムのコレクションを返すプラグインがありますが、コードが使用しているコンテナーのタイプをプラグインに認識させたくありません。

プラグインにアイテムのコレクションへのイテレータを提供beginendせてから、適切と思われる範囲を消費します。

イテレータの最大の利点は、データの保存方法(コンテナ)とデータの使用方法(アルゴリズム、この場合はプラグインデータを使用するアプリケーションコード)を完全に分離できることです。

このように、プラグインがデータをどのように保存するかを気にする必要はありません。プラグインは、データを提供した後、データをどのように処理するかを気にする必要はありません。

于 2010-12-31T07:28:48.570 に答える
0

「共通インターフェース」を書いたとき、抽象クラスと標準コンテナーをラップするサブクラスを備えたJavaスタイルを表示することになると確信していました。たくさんのtypeid呼び出しを見て驚いた...

しかし、なぜあなたはこれをしたいのですか?ほとんどのコンテナは共通のインターフェイスを共有しており、SFINAEの機能を使用すると、特別なコードを記述する必要もありません。テンプレートを使用して、メソッドを直接呼び出すだけです。

編集:標準コンテナには仮想メソッドがないため、編集できないことを忘れましたdynamic_cast

于 2010-12-31T07:22:13.577 に答える
0

上記のクラスから始めて、プラグインに必要な最小限のインターフェースを公開します。次に、使用するコンテナの観点から実装します。これはコンテナアダプタと呼ばれ、std::stackの実装方法です。

複数のSTLコンテナ用のアダプタが本当に必要な場合は、テンプレートを使用してください。std:: stackを見てください。これは、その方法を示しています。

typeidをオンにしないでください、なぜそれが必要なのですか?

ところで、コンテナ自体を公開する必要がない限り、Jamesが提案することを実行してください。

于 2010-12-31T07:32:09.167 に答える