Помогите понять пример кода класса для C , шаблоны, operator()

#c #templates #operator-overloading

#c #шаблоны #оператор-перегрузка

Вопрос:

Я не уверен точно, что делает следующий класс, который у нас есть для примера класса. Что в следующем коде делает operator() в этом случае? Я не совсем понимаю * (begin first) и практически все возвращаемое выражение как то, что вычисляется. Любая помощь была бы отличной. Спасибо!

 // IndexCompare.h - interface for IndexCompare class template
#ifndef _INDEXCOMPARE_H_
#define _INDEXCOMPARE_H_
#pragma once

template <class random_iterator>
class IndexCompare {
public:
    IndexCompare(random_iterator begin, random_iterator end)
        : begin(begin), end(end) {}

    ~IndexCompare() {}

    bool operator() (unsigned int first, unsigned int second) {
            return (*(begin   first) < *(begin   second));

    }

private:
    random_iterator begin;
    random_iterator end;
};

#endif
  

Ответ №1:

Если вы спрашиваете, что operator () делает, это позволяет вам вызывать объект как функцию. Смотрите пример в этой статье.

Если вы спрашиваете, что делает функция в вашем примере, то это сравнение значений двух элементов, указанных индексами, переданными функции. begin first относится к элементу по индексу first , начиная от итератора begin , аналогично begin second . *(begin first) возвращает значение в этом расположении.

Вы можете использовать этот класс с любым контейнером STL (который поддерживает произвольный доступ), передав пару итераторов. Например, вы могли бы использовать его с вектором, подобным этому:

 vector<int> vec;
/* add some elements here */
IndexCompare<vector<int>::iterator> compare(vec.begin(), vec.end());
  

Теперь при вызове compare(2, 5) , например, будут сравниваться значения vec[2] и vec[5] .

Ответ №2:

begin является итератором (думаю, указателем), поэтому begin first перемещается на позицию first. или, во втором случае, на позицию second. однако он не изменяет begin себя.

* это оператор разыменования, который, по сути, возвращает значение, на которое указывается

Ответ №3:

Operator() в основном определяет функциональность для ‘()’ по отношению к вашему классу. Итак, в этом случае, если бы у нас был экземпляр IndexCompare с именем ‘ic’, мы могли бы написать ‘ic()’, и определенная функциональность была бы запущена, аналогично вызову функции и определению.

Я надеюсь, это поможет понять расширение operator.