Определение оператора () функции внутри структуры

Обновить

December 2018

Просмотры

2.2k раз

2

При переходе через один из учебников в библиотеке Boost , на функции оберток ( http://www.boost.org/doc/libs/1_55_0/doc/html/function/tutorial.html ) я наткнулся на следующий код:

  1     boost::function<float (int x, int y)> f;
  2
  3     struct int_div {
  4         float operator() (int x, int y) const { return ((float)x)/y; }
  5     };
  6
  7
  8     int main()
  9     {
 10         f = int_div();
 11         cout << f(5, 3) << endl;
 12         return 0;
 13     }

Я пытаюсь обернуть вокруг моей головы об определении функции (оператор ()) внутри структуры, а затем назначая-структуры (с помощью ()) к функции обертки ф. Может кто-то пожалуйста, помогите мне понять, что происходит, насколько концепций, в строках 3-5 и 10.

Спасибо, Ахмед.

2 ответы

3

Если вы используете C ++ 11, можно написать строку # 10, как:

f = int_div{};

который , вероятно , поможет с вашей путаницы. Эта линия создает временный объект типа int_div, а затем присваивает ему f.

Это не вызов функции, даже если это выглядит как один.

4

В C ++, вы можете обеспечить оператор для типов. Как вызов функции ( ()) является еще одним оператором в языке, можно определить его для ваших типов. Таким образом, определение внутри int_divговорит «объекты типа int_divмогут иметь оператор вызова функции , примененный к ним (с операндами intи int), такой вызов будет возвращать float

boost::functionобертка вокруг ничего отзывного. Так как объект типа int_divможет быть использован с оператором вызова функции, это вызываемое и , таким образом , может быть сохранено в boost::function. Типы соответствия , а также - оператор int_divдействительно типа float(int, int).

Скобки по строке 10 не вызов этого оператора, однако; они являются вызовом конструктора. Таким образом, линия говорит «создать объект типа с int_divпомощью конструктора по умолчанию этого типа, и назначить этот объект в f