Я нашел несколько хороших примеров функторов в SO, таких как this one, и все убедительные примеры, кажется, используют состояние в классе, который определяет operator()
.
Я натолкнулся на пример в книге, в котором определяется оператор вызова функции без состояния, и я не могу не чувствовать, что это неудобное использование, и что указатель на функцию обычного стиля будет лучше, чем использование 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 <typename E, typename C>
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);