Должен ли я использовать лямбда или функтор для функции сравнения? - PullRequest
1 голос
/ 24 сентября 2019

Я занимаюсь рефакторингом проекта 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.Но я не уверен, стоит ли мне просто использовать функтор в этом случае, потому что я хочу вызывать его во многих других классах на протяжении всего моего проекта.

Я думал о рефакторинге в нечто вроде следующего:

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

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

Обе эти реализации по сути одинаковы?Должен ли я предпочесть одно другому, и если да, то почему?

Ответы [ 2 ]

5 голосов
/ 24 сентября 2019

Лямбды - это просто синтаксический сахар для функторов.Их главным преимуществом является их плотный синтаксис и то, что вы можете определять их встроенными без необходимости давать им имя.

Этот функтор используется в различных местах в моем проекте.

Если вы хотите назвать тип и использовать его в разных местах, то использование лямбды не имеет большого преимущества перед использованием вашего класса функторов.

3 голосов
/ 24 сентября 2019

Мой совет по выбору между лямбда-выражением и функтором имен: если вам нужно обратиться к имени типа функтора, используйте именованный функтор, в противном случае вы можете использовать лямбда-выражение (если вам так больше нравится).

Случай, когда требуется имя типа, действительно при сохранении функтора как переменной-члена.Таким образом, именованный функтор будет предпочтительнее в этом случае.Использование функции-оболочки для этого случая может привести к ненужным накладным расходам во время выполнения.

В некоторых случаях вам может понадобиться сослаться на типы выведенных параметров, где лямбда не может использоваться до c ++ 20.

Вы можете сделать лямбду легко повторной, возвращая ее из функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...