У меня мало вопросов по поводу ()
оператор. Пожалуйста, помогите мне получить ясную идею.
()
оператор (()
перегрузка оператора).()
использование оператора (в каких ситуациях это полезно, удобно или подходит для использования ()
оператор).Он в основном используется в объектах функций для имитации вызовов функций.
#include <iostream>
struct Functor
{
void operator()() {
std::cout << "lol\n";
}
};
int main()
{
Functor f;
f(); // output: "lol"}
Придуманный пример, да, но это становится более сложным с аргументами конструктора и когда, скажем, сохраняется этот функтор для использования в алгоритме. Это очень распространено в стандартной библиотеке C ++.
Ты не иметь использовать это таким образом; Другой пример — симуляция доступа к многомерным массивам:
#include <vector>
template<typename T>
struct Matrix
{
Matrix(unsigned m, unsigned n)
: m(m), n(n), vs(m*n) {}
T& operator()(unsigned i, unsigned j)
{
return vs[i + m * j];
}
private:
unsigned m;
unsigned n;
std::vector<T> vs;
};
/**
* _~
* _~ )_)_~
* )_))_))_)
* _!__!__!_
* \______t/
* ~~~~~~~~~~~~~
*/
int main()
{
const unsigned int WIDTH = 3;
const unsigned int HEIGHT = 3;
Matrix<long> m(WIDTH, HEIGHT);
m(1,1) = 42;
}
Этот полезен, потому что operator[]
может принимать только один параметр (хотя этот параметр может быть списком инициализатора, который является обходным путем).
Оператор () используется для создания так называемого объекта функции, называемого «функтор»
Есть несколько очень интересных вещей, которые позволяет сделать наличие функционального объекта, включая передачу функционального объекта в качестве параметра.
Ссылка, которую я публикую ниже, является видео из класса, который я посещал, где профессор говорит о функторах. Я нахожу это очень полезным. (Примечание: vid также говорит о шаблонах классов)