将C ++比较器仿函数作为参数传递出来的问题

时间:2011-07-22 00:44:46

标签: c++ functor

假设我有一个名为LinkedList的模板类,它还包含一个名为Sort的方法 我希望能够有一个默认比较器,假设类型T可以与<操作

但是,我希望能够覆盖其他类型的那个。

这是我正在扩展的自定义库的一部分。没有STL。

e.g。

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);

这大致是我班级的样子。实际上MergeSort是一个私人数据成员,但是当我愚弄并尝试使其工作时,我暂时将其公之于众。 MergeSort最终将被Sort调用。

我无法编译这个。只是想知道你通常会如何传递Functor对象。

2 个答案:

答案 0 :(得分:2)

你不能说template <class T, class Comparator<T>>,即有一个模板参数本身就是另一个参数的参数。像标准库那样做并使用默认参数:

template <class T, class Comparator = std::less<T>>
class MyClass
{
  ...
}

此外,Comparator将成为您需要在某个时刻进行实例化的对象。同样,默认参数是关键:

void MyClass::doSomething(Foo x, Comparator comp = Comparator())
{
  /* ... */
  if (comp(a, b)) { /* ... */ }
  /* ... */
}

答案 1 :(得分:1)

我没有看到为什么functor类型应该是列表类型的一部分的原因:如果它是直接链接列表,则排序不是不变量的一部分以及列表的内容除非专门致电MergeSort会员时。我建议将其作为该成员的模板参数:

template<typename T>
struct LinkedList {
    template<typename Functor>
    Node*
    MergeSort(Node* node, Functor f) {
        // ...
        if(f(NodeA, NodeB)) {
            // ...
        }
        // ...
     }
};
相关问题