Это просто перегрузка оператора и не имеет ничего общего с C++ 11 или многопоточным. Перегруженный оператор - это просто нормальная функция с забавным именем (это может быть немного упрощенным, но это хорошее правило для начинающих).
Ваш класс имеет функцию с именем ()
. Это все. Технически, вы могли бы также назвать функцию foo
или f
или TwoParentheses
.
Рассмотрим простой пример:
#include <iostream>
class Example
{
public:
void operator()() { std::cout << "()"; }
void foo() { std::cout << "foo"; }
void TwoParentheses() { std::cout << "TwoParentheses"; }
};
int main()
{
Example e;
e.operator()();
e.foo();
e.TwoParentheses();
}
Теперь призывающую перегруженный оператор, как в этом примере в main
, изложив всю .operator()
часть, довольно бессмысленно, потому что цель перегруженного оператора, чтобы сделать код вызова проще. Вы бы вместо того, чтобы вызвать вашу функцию как это:
int main()
{
Example e;
e();
}
Как вы можете видеть, e();
теперь выглядит точно так, как если бы вы назвали функцию.
Именно поэтому operator()
- специальное имя, в конце концов. В шаблоне вы можете обрабатывать объекты с помощью operator()
и указателями функций с помощью того же синтаксиса.
Рассмотрим это:
#include <iostream>
class Example
{
public:
void operator()() { std::cout << "Example.operator()\n"; }
};
void function() { std::cout << "Function\n"; }
template <class Operation>
void t(Operation o)
{
o(); // operator() or "real" function
}
int main()
{
Example object;
t(object);
t(function);
}
Это причина, почему operator()
является важной функцией в обобщенном программировании C++, и часто требуется.
Поиск «functor» в C++ – P0W