На на этой странице Я нашел хороший пример указателей на функции в C ++ (а также функторов, но этот вопрос не о функторах).Ниже приведены некоторые копии этой страницы.
#include <iostream>
double add(double left, double right) {
return left + right;
}
double multiply(double left, double right) {
return left * right;
}
double binary_op(double left, double right, double (*f)(double, double)) {
return (*f)(left, right);
}
int main( ) {
double a = 5.0;
double b = 10.0;
std::cout << "Add: " << binary_op(a, b, add) << std::endl;
std::cout << "Multiply: " << binary_op(a, b, multiply) << std::endl;
return 0;
}
Я понимаю код в общих чертах, но есть пара вещей, которые меня всегда смущают.Функция binary_op()
принимает указатель на функцию *f
, но когда она используется, например, в строке 19 binary_op(a, b, add)
, передается символ функции add
, а не то, что можно считать указателем &add
.Теперь вы можете сказать, что это потому, что символ add
является указателем;это адрес бита кода, соответствующего функции add()
.Очень хорошо, но здесь все еще есть расхождение типов.Функция binary_op()
принимает *f
, что означает, что f
является указателем на что-то.Я передаю add
, который сам по себе является указателем на код.(Верно?) Итак, f
присваивается значение add
, что делает f
указателем на код, что означает, что f
является функцией, аналогичной add
, что означает, что f
долженназываться как f(left, right)
, точно так же, как add
следует называть, но в строке 12 он называется как (*f)(left, right)
, что мне кажется неправильным, потому что это похоже на написание (*add)(left, right)
и *add
это не функция, это первый символ кода, на который указывает add
.(Верно?)
Я знаю, что замена оригинального определения binary_op()
на следующее также работает.
double binary_op(double left, double right, double f(double, double)) {
return f(left, right);
}
И на самом деле, это имеет для меня гораздо больше смысла, нооригинальный синтаксис не имеет смысла, как я объяснил выше.
Итак, почему синтаксически правильно использовать (*f)
вместо f
?Если символ func
сам по себе является указателем, то что конкретно означает фраза «указатель на функцию» или «указатель на функцию»?Исходный код в настоящее время означает, что когда мы пишем double (*f)(double, double)
, что тогда будет f
?Указатель на указатель (потому что (*f)
сам по себе является указателем на бит кода)?Является ли символ add
такой же вещью, как (*f)
, или такой же вещью, как f
?
Теперь, если ответ на все это будет "Да, синтаксис C ++странно, просто запомните синтаксис указателя на функцию и не подвергайте его сомнению. ", тогда я неохотно приму это, но мне бы очень хотелось получить правильное объяснение того, что я здесь не так.
Я прочитал этот вопрос , и я думаю, что понимаю это, но не нашел его полезным в решении моей путаницы.Я также прочитал этот вопрос , который также не помог, потому что он напрямую не решает мою проблему несоответствия типов.Я мог бы продолжать читать море информации в Интернете, чтобы найти мой ответ, но эй, это то, что Stack Overflow для права?