2013-02-27 99 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提供了一個類型擦除的容器抽象,可能是有用的。