簡體   English   中英

將 C++ 比較器仿函數作為參數傳遞的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM