c вызывать вызов функции без точки или этого оператора указателя

#c

#c

Вопрос:

У меня есть вопрос на c , пожалуйста, посмотрите код ниже:

 ArbitraryIterator *iter = (ArbitraryIterator *) state->iter;

ArbitraryCollection_Entry *resu<

result = (ArbitraryCollection_Entry *) (*iter)();
 

Мой вопрос находится в самом конце этого блока кода. Я не уверен, что делает последняя часть «(* iter) ()». Это вызов функции, но я не уверен, что он вызывает? Это еще один способ вызвать конструктор? Я знаю, что это может быть более общим вопросом и не столь специфичным для того, как он реализуется в приведенном выше примере кода. Любая помощь или разъяснения по этому вопросу будут оценены.

Спасибо

Комментарии:

1. Что такое state ? Покажите его объявление.

2. Делая дикое предположение, я думаю, что iter это указатель на функтор (т. Е. Указатель на объект функции)

3. Я не могу сказать больше, не зная, что такое ArbitraryIterator , но, похоже, он будет реализовывать an operator()() , который возвращает некоторый тип указателя в своем определении. Это то, что вызывается в последней строке.

4. @WojtekSurowka Что еще тогда? Указатель на ArbitraryIterator разыменовывается, а затем мы вызываем разыменованный объект operator() . Согласно этому списку прецедентов , вызов происходит до приведения — поэтому мы приводим значение, возвращаемое с помощью ArbitraryIterator::operator() , затем приводим его к ArbitraryCollection_Entry* и присваиваем ему result .

5. @MoreAxes Извините, я неправильно прочитал код, вы правы

Ответ №1:

 (*iter)();
 

Это 2 действия :

  • Разыменование iter (вызов его operator* )
  • Вызов функции operator() в результате предыдущей операции без параметров

Ваш итератор выполняет итерацию по коллекции вызываемых объектов, примером такого типа может быть:

 std::vector<std::function<void*()>>::iterator
 

Комментарии:

1. Возможно, он хотел написать (void*) ?

2. Спасибо за быстрый ответ. Код, написанный выше, выглядит именно так, как он выглядит (за исключением фактических имен классов), поэтому в нем не отсутствует (void*), как предполагают другие оси. Просто для ясности, итак, вы говорите, что эта последняя часть кода (* iter)() на самом деле вызывает функцию, разыменованную iter ? Я не уверен, что это будет за функция. Более конкретно, что вы подразумеваете под «вызовом operator()»?

3. @user3780054 Он, вероятно, предположил это перед моим редактированием 😉 Разыменовывается сам итератор, результатом этого действия (разыменования) является функция, которая затем вызывается без параметров 🙂

4. Спасибо Drax. Просто любопытно, помимо того, что это итератор для вызываемых объектов, можете ли вы придумать что-нибудь еще или вы достаточно тверды в этой оценке?

5. @user3780054 Я не могу придумать ничего другого, что могло бы быть.