我正在使用多重集(集合将是相同的),并将它们作为一堆函数的参数。我的功能看起来像这样:
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>
,这是非常糟糕的。
所以,我的问题是,我怎么能没有这个问题?如何声明接受多集(或集)的函数而不管它们的比较函数是什么?
答案 0 :(得分:2)
您可以使用功能模板:
template <typename M1, typename M2>
void insert(const int val, M1& low, M2& high);
如果您想将自己限制为std::multiset<int, X>
,另一个选择是使用模板模板参数。
答案 1 :(得分:1)
如果可能的话,我会使用模板来获取任意容器或迭代器。
如果你真的需要它不是一个模板并且能够处理不同类型的multiset
,boost::any_range
提供了一个可能有用的类型擦除容器抽象。