设置自定义比较类型

时间:2013-02-27 18:58:07

标签: c++ stl

我正在使用多重集(集合将是相同的),并将它们作为一堆函数的参数。我的功能看起来像这样:

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

然后我发现我需要一个多重集的自定义比较功能。我做了它声明struct并覆盖()运算符。

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

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

此外,order是一个比较函数,它与我可能声明的任何其他比较函数不同(即使它比较的类型完全相同)。 我的意思是multiset<int, order1> != multiset<int, order2>,这是非常糟糕的。

所以,我的问题是,我怎么能没有这个问题?如何声明接受多集(或集)的函数而不管它们的比较函数是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用功能模板:

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

如果您想将自己限制为std::multiset<int, X>,另一个选择是使用模板模板参数。

答案 1 :(得分:1)

如果可能的话,我会使用模板来获取任意容器或迭代器。

如果你真的需要它不是一个模板并且能够处理不同类型的multisetboost::any_range提供了一个可能有用的类型擦除容器抽象。