Двойные скобки? - PullRequest
       0

Двойные скобки?

2 голосов
/ 10 марта 2020

Только что столкнулся с этим битом кода:

if(iElement->getData().contains("someText") and iElement->getData()("someOtherText").toString() == "true")

Что поражает меня, так это эта часть:

iElement->getData()("someOtherText").toString()

Точнее говоря: ()()

Я нигде не видел перегрузчика.

Кстати, это должен быть код C ++. Компилируется и работает нормально.

Не могу найти нигде никакой информации, так как я не знаю, что вообще искать ... Может кто-нибудь объяснить, пожалуйста?

Ответы [ 2 ]

8 голосов
/ 10 марта 2020
 iElement->getData()("someOtherText").toString()

Обрабатывается в следующем порядке

  1. Вызов iElement->getData()

  2. Об объекте, возвращаемом getData(), вызов operator(), то есть перегруженный оператор вызова, с аргументом "someOtherText"

  3. Для объекта, возвращаемого operator(), вызов toString()

Обратите внимание, что operator() не обязательно должен быть переопределен. getData() может, например, также возвращать указатель на функцию.

0 голосов
/ 10 марта 2020

В вопросе OP о наличии: ()()
вторая пара скобок - это оператор вызова для объекта-функции, реализующего оператор (), например, с типом данных ниже:

#include <string>

struct String {
  bool toString () {
    return "true";
  }
};

struct Data {
  String operator()(std::string s) {
    return str;
  }

  bool contains (std::string s) {
    return s.empty ();
  }
  String str;
};

struct Element {
  Data& getData () {
    return data;
  }
  Data data;
};

int main () {
  Element* iElement = new Element ();

  if (iElement->getData ().contains ("someText") and iElement->getData ()("someOtherText").toString ()) {};
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...