【问题标题】:Problem passing C++ comparator functor as a parameter将 C++ 比较器函子作为参数传递的问题
【发布时间】:2011-07-22 00:44:45
【问题描述】:

假设我有一个名为 LinkedList 的模板类,它还包含一个名为 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);

这大概就是我的班级的样子。实际上 MergeSort 是一个私有数据成员,但我暂时将其公开,而我只是在闲逛并尝试使其工作。 MergeSort 最终会被 Sort 调用。

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

【问题讨论】:

  • 如果您希望我们解决它们,请告诉我们您遇到了哪些编译器错误?

标签: c++ functor


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。这似乎是有道理的。但是我遇到了一些编译器错误。请参阅上面的更新。
  • 已排序!没关系。我有一个错字。非常感谢您的帮助。
  • 我认为您需要在模板声明末尾的 2 个 &gt;s 之间留一个空格:template &lt;class T, class Comparator = std::less&lt;T&gt; &gt; 至少可以使用 g++ 进行编译。
【解决方案2】:

我看不出函子类型应该是列表类型的一部分的原因:如果它是直链表,则排序不是不变量的一部分,也不属于列表的作用除非 专门调用MergeSort 成员时。我建议将其作为该成员的模板参数:

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

【讨论】:

  • 嗯,是的,当然——我只是在看树,而不是森林。也就是说,我们还要从std::list 复制多少内容到这篇文章中? :-)
猜你喜欢
  • 2020-11-25
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
相关资源
最近更新 更多