Bootstrap

c++中的函数指针

格式
int (*fcnPtr)(); // fcnPtr 是一个指向函数的指针,该函数参数为空,返回值为int。
int (*const fcnPtr)();

注意其中影响优先级顺序的()不能省略,否则会变为int *fcnPtr(); 表示一个函数的声明,该函数参数为空,返回值为int*

用法
赋值和调用
#include <iostream>
using namespace std;
int goo()
{
    cout << 1 << endl;
    return 0;
}

int goo2()
{
    cout << 2 << endl;
    return 0;
}

int foo(int x)
{
    cout << x << endl;
    return 0;
}

int main()
{
    int (*fcnPtrGoo)() { &goo }; // 赋值 (&可省略,支持隐式转换)
    fcnPtrGoo(); //调用

    fcnPtrGoo = &goo2; // 赋值
    (*fcnPtrGoo)(); //调用

    int (*fcnPtrFoo)(int) = &foo;// 赋值
    fcnPtrFoo(3); //调用

    return 0;
}

注意函数指针的参数和返回值类型必须和原函数一致

// function prototypes
int foo();
double goo();
int hoo(int x);

// function pointer initializers
int (*fcnPtr1)(){ &foo };    // okay
int (*fcnPtr2)(){ &goo };    // wrong -- return types don't match!
double (*fcnPtr4)(){ &goo }; // okay
fcnPtr1 = &hoo;              // wrong -- fcnPtr1 has no parameters, but hoo() does
int (*fcnPtr3)(int){ &hoo }; // okay
作为函数参数
void selectionSort(int* array, int size, bool (*comparisonFcn)(int, int))

can be equivalently written as:

void selectionSort(int* array, int size, bool comparisonFcn(int, int))
使用alias简化
  1. using
    using ValidateFunction = bool(*)(int, int);
    
    From
    bool validate(int x, int y, bool (*fcnPtr)(int, int)); // ugly
    
    To
    bool validate(int x, int y, ValidateFunction pfcn) // clean
    
  2. std::function
    #include <functional>
    bool validate(int x, int y, std::function<bool(int, int)> fcn); // std::function method that returns a bool and takes two int parameters
    
using ValidateFunctionRaw = bool(*)(int, int); // type alias to raw function pointer
using ValidateFunction = std::function<bool(int, int)>; // type alias to std::function

简化后的赋值调用

int main()
{
    using FcnPtrGooAlias = int(*)();
    FcnPtrGooAlias fcnGoo{ &goo };
    fcnGoo();

    std::function<int(int)> fcnFoo = &foo;
    fcnFoo(2);

    return 0;
}

Reference
https://www.learncpp.com/cpp-tutorial/function-pointers/

Foo(2);

return 0;

}


Reference
<https://www.learncpp.com/cpp-tutorial/function-pointers/>

;