1

3 種類のマップとベクトルがある場合:

map1<CString, int>
map2<CString, int, std::function1>
map3<some_wrapper_of_CString, int, std::function2>

stl には、ポリモーフィズムを行うためだけに抽象コンテナーまたは独自の抽象コンテナーを作成する方法があります。

abstract_map = map1 または map2 または map3

私のクラスには map1 が含まれていますが、これは私の大学が職場で使用している他のクラスをクラッシュさせるため、変更できません。map1 をラップする抽象マップを作成することで、他の変更なしで map2 と 3 を渡すことができると思いました...

それが理にかなっていることを願っています.....

4

3 に答える 3

3

いいえ、ありません。要素が互いに変換できない場合、その目的は何でしょうか?

あなたはいつでもできる:

containera c;
containerb c2(c.begin(), c.end());

これにより、すべての要素が一方のコンテナから他方のコンテナに変換されます。

実際に同じ基礎を持つコンテナーがある場合value_type、コンテナー型に対する通常の抽象化は反復子であり、抽象コンテナーではありません。

ファンクター型の型消去のみが必要であることを明確にした後:

class X {
  // constructor taking the full type
  X(const std::map<CString, int, std::function<bool(CString, int)>& x) : my_map(x) {}

  // constructor taking the default std::less
  X(const std::map<CString, int>& x) : my_map(x.begin(), x.end(), std::less<CString>()) {}

private:
  std::map<CString, int, std::function<bool(CString, int)> my_map;
};
于 2012-12-21T08:31:41.887 に答える
2

STLには抽象コンテナがないだけでなく、STLコンテナは多態的に動作することを意図していないため(たとえば、仮想デストラクタがないため)、STLコンテナから継承しないでください。したがって、別の解決策を探す必要があります。

この場合、継承よりも構成を優先する必要があります。std::map次のような、を含む独自の抽象マップクラスを作成できます。

template<typename T>
class BaseMap
{
  // Whatever you need here

private:

  std::map<T> internalMap;
}

次に、必要に応じてこのクラスから継承します。

template<typename T>
class Map1 : public BaseMap<T>
{
  // Specialise your class here
}

もちろん、BaseMapインターフェースを継承しないため、マップに必要なインターフェースを提供する必要がありstd::mapます。ここでは、必要な仮想メソッド、純粋仮想メソッド、または非仮想メソッドを記述できます。

たぶんあなたが自分自身に尋ねなければならない最初の質問は:あなたは本当に異なるマップクラスが必要ですか?そして、もしそうなら、あなたは本当にそれらが多型である必要がありますか?

于 2012-12-21T08:39:11.740 に答える
2

stlには、ポリモーフィズムを行うためだけに抽象コンテナまたは独自の抽象コンテナを作成する方法がありますか

標準 C++ ライブラリにはありません。

テンプレートと動的ポリモーフィズムは、うまく組み合わせることはできません。

于 2012-12-21T08:31:17.003 に答える