Переменная itr
является итератором, который в основном является указателем, т.е. они оба указывают на объект. В этом случае итератор указывает на функцию. Вы можете получить к функции разыменование itr
(очень похоже на указатель) с *itr
. Затем вы можете использовать этот объект как функцию (потому что она одна):
for (auto itr = funcs.begin(); itr != funcs.end(); ++itr)
(*itr)(10); // like calling func[i](10)
Поскольку это итератор, вы также можете использовать оператор ->
, чтобы вы могли использовать указанную на объекте напрямую. К сожалению, если вы попытались сделать то, что может показаться очевидным:
itr->(10); // error
, синтаксис языка просто не позволяет этого (скобки могут быть сложными, даже для компилятора). К счастью, в языке есть способ, позволяющий вам явно сказать, что вы имеете в виду, а именно: «Я просто хочу рассматривать это как функцию, поэтому я могу вызывать ее с помощью ()
». Существует функция под названием оператор вызова , которая пишется operator()
, которую вы можете использовать. Синтаксис для этого:
for (auto itr = funcs.begin(); itr != funcs.end(); ++itr)
itr->operator()(10);
Тем не менее, этот синтаксис, по-видимому, лишает цели использования удобного оператора ->
.
Однако я рекомендую вам используйте диапазон для l oop здесь (обычно это лучший выбор, если вы можете его использовать). Синтаксис намного яснее при выражении намерений кода:
for (auto &func : funcs) // for every function in funcs
func(10); // use the function
Вот рабочая демо .