pure - struct function pointer




你如何在C中傳遞一個函數作為參數? (4)

宣言

採用函數參數的函數的原型如下所示:

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的函數應用。 首先考慮一下這個循環看起來像直接調用print:

for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
  print(ctr);
}

由於func的參數聲明表示f是指向所需函數的指針的名稱,我們首先回想如果f是指針,那麼*ff指向的東西(即在這種情況下的函數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

我想創建一個函數,該函數執行一組數據上通過參數傳遞的函數。 你如何在C中傳遞一個函數作為參數?


將函數的地址作為參數傳遞給另一個函數 ,如下所示

#include <stdio.h>

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 <stdio.h>

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();
}

從C ++ 11開始,您可以使用函數庫以簡潔通用的方式執行此操作。 語法是,例如,

std::function<bool (int)>

其中bool是第一個參數類型為int的單參數函數的返回類型。

我在下面列出了一個示例程序:

// g++ test.cpp --std=c++11
#include <functional>

double Combiner(double a, double b, std::function<double (double,double)> 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<class T>
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);
}

這個問題已經有了定義函數指針的答案,但是它們可能會變得非常混亂,特別是如果你要將它們傳遞給你的應用程序。 為了避免這種不愉快,我建議你將函數指針變成更可讀的類型。 例如。

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');

有些庫可以幫助將函數指針轉換為可讀的類型。 boost函數庫很棒,非常值得努力!

boost::function<int (char a)> functiontype2;

比上面好得多。





parameters