[英]Problem passing C++ comparator functor as a parameter
假設我有一個名為 LinkedList 的模板 class 還包含一個名為 Sort 的方法,我希望能夠有一個默認比較器,它假設類型 T 可以與 < 運算符進行比較。
但是,我希望能夠為其他類型覆蓋它。
這是我正在擴展的自定義庫的一部分。 沒有 STL。
例如
template <class T, class Comparator<T> >
class LinkedList
{
...
Node* MergeSort(Node* list)
{
...
if (Comparator<T>(nodeA,nodeB))
...
}
...
};
typedef Pair<int, int> ListEntry;
struct sorter
{
inline sorter(){}
inline bool operator()(ListEntry const& a, ListEntry const& b)
{
return a.second < b.second;
}
};
Pair<int, int> entry;
LinkedList<ListEntry, sorter()> list;
list.PushFront( ListEntry(5,9) );
list.PushFront( ListEntry(77,5) );
list.PushFront( ListEntry(4,1) );
list.PushFront( ListEntry(8,44) );
list.PushFront( ListEntry(1,64) );
list.PushFront( ListEntry(3,5) );
n = list.MergeSort(node* n);
這大致就是我的 class 的樣子。 實際上 MergeSort 是一個私有數據成員,但我暫時將其公開,而我只是在閑逛並嘗試使其工作。 MergeSort 最終會被 Sort 調用。
我無法編譯這個。 只是想知道您通常如何像這樣傳遞 Functor 對象。
您不能說template <class T, class Comparator<T>>
,即有一個模板參數本身就是另一個參數的參數。 像標准庫一樣做它並使用默認參數:
template <class T, class Comparator = std::less<T>>
class MyClass
{
...
}
此外, Comparator
器將是一個 object,您需要在某些時候對其進行實例化。 同樣,默認 arguments 是關鍵:
void MyClass::doSomething(Foo x, Comparator comp = Comparator())
{
/* ... */
if (comp(a, b)) { /* ... */ }
/* ... */
}
我看不出函子類型應該是列表類型的一部分的原因:如果它是直鏈表,則排序不是不變量的一部分,也不屬於列表的作用,除非專門調用MergeSort
成員。 我建議將其作為該成員的模板參數:
template<typename T>
struct LinkedList {
template<typename Functor>
Node*
MergeSort(Node* node, Functor f) {
// ...
if(f(NodeA, NodeB)) {
// ...
}
// ...
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.