string GetDB()
{
return "Show DB";
}
void Show(string(*fun)())
{
cout << fun() << endl;
}
int main()
{
Show(GetDB);
}
Не совсем могу понять как в шестой строке функция передаётся в качестве параметра.
Как я понял, код string(*fun)() должен обьявлять указатель fun, которому я могу потом присвоить ссылку на функцию (вроде fun = GetDB). Но почему мы строку присваивания пишем в аргумент функции, и почему функция GetDB при попадании в этот аргумент копирует свой адрес в указатель fun?
string(*fun)() - это указатель на функцию, а не ссылка на функцию.
Тип "функция" в языках С и С++ является неявно приводимым к соответствующему типу "указатель на функцию". Поэтому когда вы пишете
Show(GetDB);
язык С++ неявно преобразует аргумент GetDB типа string() к требуемому типу параметра string (*)(). Если вам так больше нравится, вы можете явно сформировать указатель на функцию
Show(&GetDB);
Оба варианта полностью эквивалентны.
Симметричным образом, при вызове через указатель fun вы можете напрямую применять оператор () к указателю fun, как в вашем оригинальном коде, а можете предварительно явно разыменовывать указатель (*fun)(). Оба варианта полностью эквивалентны.
Продвижение своими сайтами как стратегия роста и независимости