Ключевым моментом является то, что указатели на функции используются «под капотом» все время в общем программировании. Один имеет тенденцию забывать об этом, потому что аргумент аргумента шаблона скрывает синтаксис указателя функции.
Например:
#include <algorithm>
#include <iterator>
bool f(int i)
{
return i == 1;
}
int main()
{
int arr[] = { 1, 1, 3 };
int count = std::count_if(std::begin(arr), std::end(arr), f);
}
f
в main
«s последней строке является функцией указатель, так как функция std::count_if
шаблон будет принимать что-либо, что может быть использован с синтаксисом ()
. Цитирование cppreference.com:
template< class InputIt, class UnaryPredicate >
typename iterator_traits<InputIt>::difference_type
count_if(InputIt first, InputIt last, UnaryPredicate p);
UnaryPredicate
может быть указателем на функцию, и является одним в приведенном выше примере.
Компилятор просто выводит свой точный тип, bool(*)(int)
, автоматически, когда вы проходите f
.Технически, вы могли бы также написать вызов, как это:
// just for illustration:
std::count_if<int*, bool(*)(int)>(std::begin(arr), std::end(arr), f);
Если не было никаких указателей на функции в C++, то вы не можете напрямую использовать функции в качестве сказуемых в стандартных библиотека алгоритмов. Вместо этого вам придется завербовать их в классы все время:
#include <algorithm>
#include <iterator>
bool f(int i)
{
return i == 1;
}
struct Functor
{
bool operator()(int i) const
{
return f(i);
}
};
int main()
{
int arr[] = { 1, 1, 3 };
int count = std::count_if(std::begin(arr), std::end(arr), Functor());
}
Что вы подразумеваете под «преимуществом»? Указатель функции - это еще один инструмент, который вы можете использовать, вот и все. Они позволяют делать то, что невозможно сделать с другими языковыми инструментами. Спросить о своих «преимуществах» примерно так же бессмысленно, как спрашивать о «преимуществе заявления' if' ». – dasblinkenlight
1. Вы можете изменить функцию, на которую указывает указатель. 2. Вы можете сделать указатель массива указателей функции. – GingerPlusPlus
Эти «преимущества» при использовании указателей функций могут различаться в зависимости от того, что вы пытаетесь сделать, и с каким другим параметром вы сравниваете – dseminara