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

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

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

И затем используйте его этот путь:

A a;
a();

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

25
задан Fred Nurk 18 May 2011 в 20:41
поделиться

4 ответа

Это можно использовать для создания «функторов» , объектов, которые действуют как функции:

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 . В указанной выше статье в Википедии приведены более существенные примеры.

28
ответ дан 28 November 2019 в 20:43
поделиться

Если вы создаете класс, который инкапсулирует указатель на функцию, это может сделать использование более очевидным.

1
ответ дан 28 November 2019 в 20:43
поделиться

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

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) );
18
ответ дан 28 November 2019 в 20:43
поделиться

Алгоритм, реализованный с использованием шаблона, не заботится о том, является ли вызываемый объект функцией или функтором, он заботится о синтаксисе. Либо стандартные (например, for_each ()), либо свои собственные. А функторы могут иметь состояние и делать все, что угодно, когда они вызываются. Функции могут иметь состояние только со статической локальной переменной или глобальными переменными.

5
ответ дан 28 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: