Как может быть полезно перегрузить оператор "вызов функции"?
Недавно я обнаружил, что в С++ вы можете перегрузить оператор "вызов функции", странным образом, в котором вам нужно написать две пары круглых скобок:
class A {
int n;
public:
void operator ()() const;
};
И затем используйте его следующим образом:
A a;
a();
Когда это полезно?
Ответы
Ответ 1
Это можно использовать для создания "functors" , объектов, которые действуют как функции:
class Multiplier {
public:
Multiplier(int m): multiplier(m) {}
int operator()(int x) { return multiplier * x; }
private:
int multiplier;
};
Multiplier m(5);
cout << m(4) << endl;
Вышеприведенные отпечатки 20
. Статья в Википедии, приведенная выше, дает более существенные примеры.
Ответ 2
Там немного больше, чем синтаксический выигрыш в использовании оператора(), пока вы не начнете использовать шаблоны. Но при использовании шаблонов вы можете обрабатывать реальные функции и функторы (классы, действующие как функции) таким же образом.
class scaled_sine
{
explicit scaled_sine( float _m ) : m(_m) {}
float operator()(float x) const { return sin(m*x); }
float m;
};
template<typename T>
float evaluate_at( float x, const T& fn )
{
return fn(x);
}
evaluate_at( 1.0, cos );
evaluate_at( 1.0, scaled_sine(3.0) );
Ответ 3
Алгоритм, реализованный с использованием шаблона, не волнует, является ли вызываемая вещь функцией или функтором, она заботится о синтаксисе. Все стандартные (например, for_each()) или ваши собственные. И функторы могут иметь состояние и делать все виды, когда их вызывают. Функции могут иметь только состояние со статической локальной переменной или глобальными переменными.
Ответ 4
Если вы создаете класс, который инкапсулирует указатель на функцию, это может сделать использование более очевидным.
Ответ 5
Компилятор также может встроить функтор и вызов функции. Однако он не может встроить указатель на функцию. Таким образом, использование оператора вызова функции может значительно повысить производительность, когда он используется, например, со стандартными алгоритмами С++ libary.