Как передать функцию в качестве параметра в C?
Я хочу создать функцию, которая выполняет функцию, переданную параметром в наборе данных. Как передать функцию в качестве параметра в C?
- Каковы все функции-члены, созданные компилятором для classа? Это происходит постоянно?
- Должны ли существовать функции classа / переменные перед их использованием?
- Можно ли задать аргумент по умолчанию из предыдущего аргумента?
- Эффективный C ++ Элемент 23 Предпочитайте функции, отличные от членов, не являющихся членами для функций-членов
- Как передавать анонимные типы в качестве параметров?
- Разница между методами и функциями, в Python по сравнению с C ++
- Подавление вывода windows команды функции
- Какова точка указателей на функции?
декларация
Прототип функции, которая принимает параметр функции, выглядит следующим образом:
void func ( void (*f)(int) );
Это означает, что параметр f
будет указателем на функцию, которая имеет тип возврата void
и которая принимает один параметр int
. Следующая функция ( print
) – это пример функции, которая может быть передана func
в качестве параметра, потому что это правильный тип:
void print ( int x ) { printf("%d\n", x); }
Вызов функции
При вызове функции с параметром функции переданное значение должно быть указателем на функцию. Для этого используйте имя функции (без круглых скобок):
func(print);
вызовет func
, передав ему функцию печати.
Тело функции
Как и любой параметр, func теперь может использовать имя параметра в теле функции для доступа к значению параметра. Предположим, что func применит функцию, которую она передаст к номерам 0-4. Рассмотрим, во-первых, что цикл будет выглядеть так:
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) { print(ctr); }
Поскольку в объявлении параметра func
указано, что f
является именем для указателя на нужную функцию, напомним сначала, что если f
является указателем, то *f
- это то, что f
указывает на (то есть, функция print
в этом случае). В результате просто замените каждое появление печати в вышеприведенном цикле: *f
:
void func ( void (*f)(int) ) { for ( int ctr = 0 ; ctr < 5 ; ctr++ ) { (*f)(ctr); } }
Из http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html
У этого вопроса уже есть ответ для определения указателей функций, однако они могут стать очень грязными, особенно если вы собираетесь передавать их вокруг своего приложения. Чтобы избежать этой неприятности, я бы рекомендовал вам ввести указатель функции во что-то более читаемое. Например.
typedef void (*functiontype)();
Объявляет функцию, которая возвращает void и не принимает аргументов. Чтобы создать указатель на этот тип, вы можете теперь:
void dosomething() { } functiontype func = &dosomething; func();
Для функции, которая возвращает int и принимает символ, который вы сделаете
typedef int (*functiontype2)(char);
и использовать его
int dosomethingwithchar(char a) { return 1; } functiontype2 func2 = &dosomethingwithchar int result = func2('a');
Существуют библиотеки, которые могут помочь с преrotationм указателей функций в хорошие читаемые типы. Библиотека функций ускорения великолепна и стоит усилий!
boost::function functiontype2;
намного лучше, чем выше.
С C ++ 11 вы можете использовать функциональную библиотеку, чтобы сделать это кратким и общим образом. Синтаксис, например,
std::function
где bool
– это возвращаемый тип здесь функции с одним аргументом, первый аргумент которой имеет тип int
.
Я привел пример программы ниже:
// g++ test.cpp --std=c++11 #include double Combiner(double a, double b, std::function func){ return func(a,b); } double Add(double a, double b){ return a+b; } double Mult(double a, double b){ return a*b; } int main(){ Combiner(12,13,Add); Combiner(12,13,Mult); }
Иногда, однако, удобнее использовать функцию шаблона:
// g++ test.cpp --std=c++11 template double Combiner(double a, double b, T func){ return func(a,b); } double Add(double a, double b){ return a+b; } double Mult(double a, double b){ return a*b; } int main(){ Combiner(12,13,Add); Combiner(12,13,Mult); }
Передайте адрес функции как параметр в другую функцию, как показано ниже
#include void print(); void execute(void()); int main() { execute(print); // sends address of print return 0; } void print() { printf("Hello!"); } void execute(void f()) // receive address of print { f(); }
Также мы можем передать функцию как параметр, используя указатель функции
#include void print(); void execute(void (*f)()); int main() { execute(&print); // sends address of print return 0; } void print() { printf("Hello!"); } void execute(void (*f)()) // receive address of print { f(); }
Вам нужно передать указатель на функцию . Синтаксис немного громоздкий, но он очень мощный, когда вы знакомы с ним.