我应该使用 lambda 还是仿函数作为比较函数?

Should I use a lambda or functor for a comparison function?

我正在将 C++03 项目重构为 C++11。

我有一个 class,其中定义了一个用于排序的仿函数:

class Widget
{
public:

  class SortByRules
  {
  public:
    bool operator()(const Widget &lhs, const Widget &rhs) const;
  }
}

这个仿函数在我项目的各个地方都用到了。用法示例:

std::vector<Widget> widgets;

// ...

std::sort(widgets.begin(), widgets.end(), Widget::SortByRules());

据我所知,在 C++11 中,lambda 应该比仿函数更受欢迎。但是我不确定在这种情况下我是否应该坚持使用仿函数,因为我想在整个项目中的多个其他 classes 中调用它。

我正在考虑重构为如下内容:

// .h
class Widget
{
public:
 Widget();
 std::function<bool(Widget&, Widget&)> SortByRules;
};

// .cpp
Widget::Widget() :
SortByRules([](Widget& lhs, Widget& rhs) { /* ... */ }
{
}

这两种实现本质上是一样的吗?我应该更喜欢其中之一吗?如果是,为什么?

Lambdas 基本上只是仿函数的语法糖。它们的主要优点是语法密集,您可以内联定义它们而无需给它们命名。

This functor is used in various places throughout my project.

如果你想命名类型并在不同的地方使用它,那么使用 lambda 与使用你的仿函数没有太大优势 class。

对于在 lambda 和名称仿函数之间进行选择,我的建议是:如果您需要引用仿函数类型的名称,则使用命名仿函数,否则您可以使用 lambda(如果您愿意)。

确实需要类型名称的情况是将仿函数存储为成员变量。因此,在这种情况下,命名仿函数会更可取。在这种情况下使用函数包装器会引入不必要的运行时开销。

在某些情况下,您可能需要参考推导参数的类型,其中 lambda 直到 c++20 才可用。

您可以通过从函数返回 lambda 来使其易于重用。