2

私はマルチセットを使用しており(セットは同じです)、それらを一連の関数の引数として使用しています。私の関数は次のようになりました。

void insert(const int val, multiset<int>& low, multiset<int>& high)

次に、マルチセットの1つにカスタム比較関数が必要であることがわかりました。私はそれを宣言しstruct、()演算子をオーバーライドしました。

かつての私の多重集合の定義:multiset<int> low今はmultiset<int, order> lowです。

これに伴う問題は、実際にのタイプlowを変更しているため、すべてのパラメーターでタイプを変更する必要があることです。これにより、関数の一般性が大幅に低下します(関数はマルチセットの比較方法を知る必要がありません)。 。

さらに、orderこれは1つの比較関数であり、これまでに宣言した他の比較関数とは異なります(比較する型はまったく同じですが)。私が言いたいのはmultiset<int, order1> != multiset<int, order2>、それは非常に悪いことです。

だから、私の質問は、どうすればこの問題を抱えることができないのですか?比較関数に関係なく、マルチセット(またはセット)を受け入れる関数を宣言するにはどうすればよいですか?

4

2 に答える 2

2

関数テンプレートを使用できます。

template <typename M1, typename M2>
void insert(const int val, M1& low, M2& high);

に制限したい場合の別のオプションは、std::multiset<int, X>テンプレート テンプレート パラメータを使用することです。

于 2013-02-27T19:00:11.937 に答える
1

可能であれば、テンプレートを使用して任意のコンテナーまたはイテレーターを取得します。

multisetテンプレートではなく、さまざまなタイプのを処理できることが本当に必要な場合boost::any_rangeは、タイプが消去されたコンテナの抽象化が役立つ可能性があります。

于 2013-02-27T19:05:03.150 に答える