2013-02-27 103 views
2

我正在使用multisets(集合将是相同的),并将它们作为一组函数的参数。我的功能看起来像这样:设置自定义比较类型

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

然后我发现我需要一个自定义比较函数的其中一个multisets。我做了它声明struct并重写()运算符。

我多集的定义,一旦是:multiset<int> low现在multiset<int, order> low

问题是我实际上改变了low的类型,因此我需要在每一个参数中改变它,这大大降低了我函数的一般性(函数不需要知道比较多重集的方法)。

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

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

回答

2

你可以使用函数模板:

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

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

1

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

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