#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 Я не могу придумать ничего другого, что могло бы быть.