首页 > 解决方案 > 我应该使用 lambda 或仿函数进行比较函数吗?

问题描述

我正在将 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) { /* ... */ }
{
}

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

标签: c++c++11refactoring

解决方案


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

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

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


推荐阅读