我应该将 lambda 或函子用于比较函数吗?

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

本文关键字:比较 函数 用于 lambda 我应该      更新时间:2023-10-16

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

我有一个类,其中定义了用于排序的函子:

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 应该优先于函子。但是我不确定在这种情况下我是否应该坚持使用函子,因为我想在整个项目中的多个其他类中调用它。

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

// .h
class Widget
{
public:
Widget();
std::function<bool(Widget&, Widget&)> SortByRules;
};
// .cpp
Widget::Widget() :
SortByRules([](Widget& lhs, Widget& rhs) { /* ... */ }
{
}

这两种实现本质上是相同的吗?我应该更喜欢一个而不是另一个,如果是这样,为什么?

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

这个函子在我的项目中的各个地方使用。

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

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

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

在某些情况下,您可能需要引用推导参数的类型,其中 lambda 在 c++20 之前不可用。

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