2

我正在使用多重集(集是相同的),并将它们作为一堆函数的参数。我的函数如下所示:

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

然后我发现我需要为其中一个多组提供自定义比较功能。我这样做是声明一个struct并覆盖 () 运算符。

我的多重集定义曾经是:multiset<int> low现在是multiset<int, order> low.

这样做的问题是我实际上是在更改 的类型low,因此我需要在每个参数中更改它,这大大降低了我的函数的通用性(函数不需要知道多集的比较方法) .

此外,order还有一个比较函数,它不同于我可能声明过的任何其他比较函数(即使它比较的类型完全相同)。我的意思是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 回答