#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.