Подтвердить что ты не робот

Как может быть полезно перегрузить оператор "вызов функции"?

Недавно я обнаружил, что в С++ вы можете перегрузить оператор "вызов функции", странным образом, в котором вам нужно написать две пары круглых скобок:

class A { 
  int n;
public: 
  void operator ()() const; 
};

И затем используйте его следующим образом:

A a;
a();

Когда это полезно?

4b9b3361

Ответ 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.