Не уверены в моей интерпретации объявления функции в C ++? - PullRequest
0 голосов
/ 29 сентября 2011

Кажется, это глупый вопрос, но я никогда не видел ничего подобного!

int operator() (const std::string& s1, const std::string& s2) const

для меня оператор - это константная функция-член, которая возвращает целое число и не содержит аргумента переменной! но нужны две константные переменные s1 и s2?!?! Я не могу понять суть этого!

class str_dist_ : 
public std::binary_function<std::string, std::string, int> {
public:
  int op() (const std::string& s1, const std::string& s2) const
  {
    if (s1 == s2)
      return 0;
    else if (s1.empty())
      return std::max(s2.size()/2, 1u);
    else if (s2.empty())
      return std::max(s1.size()/2, 1u);
    else 
      return min_edit_distance(s1, s2, zero_one_cost<char>(' '));
  }
  std::string empty() const { return std::string(); }
};

Ответы [ 3 ]

3 голосов
/ 29 сентября 2011

Часть operator() говорит, что объекты типа str_dist_ могут быть "вызваны", как если бы это была функция.(const std::string& s1, const std::string& s2) говорит нам, что на самом деле является аргументом.

Например, скажем, у нас есть объект str_dist_ obj; и два объекта std::string, str1 и str2.Затем мы можем написать что-то вроде этого

int result = obj(str1, str2);

Под обложками предыдущая строка идентична

int result = obj.operator()(str1, str2);

Обратите внимание, что первый набор скобок является частью имени членаfunction operator(), в то время как второй набор фактически перечисляет аргументы.

Если вам нужна дополнительная информация, посмотрите Функторы или Функциональные объекты.Это термины, используемые для обозначения таких вещей, как str_dist_ объекты, для которых определено operator().Если вы воспользуетесь каким-либо из этих терминов, вы обязательно найдете много информации.

2 голосов
/ 29 сентября 2011

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

str_dist_ myObject;
cout<<myObject("A string", "Another string"); // calls operator()

Первые две скобки означают, что это оператор вызова функции (как + будет означать, что это оператор + и т. Д.), Затем следует список аргументов.

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

2 голосов
/ 29 сентября 2011

Это оператор скобок (или «оператор вызова функции»):

Foo x;
int n = x(12, 'a');
int m = x.operator()(12, 'a'); // equivalent

Здесь оператор был объявлен как int Foo::operator()(int, char).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...