Я нашел несколько хороших примеров функторов на 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);