Когда функторы класса без состояния полезны вместо функции стиля ac?

Я нашел несколько хороших примеров функторов на SO, таких как this , и все убедительные примеры, похоже, используют состояние в классе, который определяет оператор () .

Я наткнулся на пример в книге, в котором оператор вызова функции определяется без состояния, и я не могу не чувствовать, что это неудобное использование, и что указатель на функцию в обычном стиле будет лучше, чем использование operator () здесь во всех смыслах - меньше кода, меньше переменных (вы должны создать экземпляры компараторов), он, вероятно, более эффективен из-за создания экземпляра и без потери смысла или инкапсуляции (поскольку это всего лишь одна функция) .

Я знаю, что std :: sort позволяет вам выбирать между классами и функциями operator () , но я всегда просто использовал функции из-за приведенной выше логики.

Каковы причины, по которым класс может быть предпочтительнее?

Вот пример (перефразированный):

class Point2D {
   //.. accessors, constructors
   int x,y;
};
class HorizComp {
public:
   bool operator()(const Point2D& p, const Point2D& q) const
   { return p.getX() < q.getX(); }
};

class VertComp {
public:
   bool operator()(const Point2D& p, const Point2D& q) const
   { return p.getY() < q.getY(); }
};

template 
void printSmaller(const E& p, const E& q, const C& isLess) {
   cout << (isLess(p, q) ? p : q) << endl; // print the smaller of p and q
}
//...
// usage in some function:
Point2D p(1.2, 3.2), q(1.5, 9.2);
HorizComp horizComp;
VertComp vorizComp;
printSmaller(p, q, horizComp);
printSmaller(p, q, vorizComp);

6
задан Michael Chinen 30 April 2018 в 18:29
поделиться