2019年2月27日 星期三

C++ function point 用法範例

C++ function point 用法範例

範例代碼1
/*****************************************************************
Name : 
Date : 2017/02/23
By   : CharlotteHonG
Final: 2017/02/23
*****************************************************************/
#include <iostream>
using namespace std;

int add(int & a, int & b){
    return a+b;
}
int sub(int & a, int & b){
    return a-b;
}
/*==============================================================*/
int main(int argc, char const *argv[]){
    // int (*ptr[2])(int &, int &){add, sub};

    // decltype(add)* ptr[2]={add, sub};

    // typedef int (fp)(int &, int &);
    // fp* ptr[2]{add, sub};

    // typedef int (*fp)(int &, int &);
    // fp ptr[2]{add, sub};

    // using fp = int(*)(int &, int &);
    // fp ptr[2]{add, sub};

    using fp = int(int &, int &);
    fp* ptr[2]{add, sub};

    int a=1, b=3;
    cout << "ptr[0](a, b)=" << ptr[0](a, b) << endl;
    cout << "ptr[0](a, b)=" << ptr[1](a, b) << endl;
    return 0;
}
/*==============================================================*/
範例代碼2
/*****************************************************************
Name : 
Date : 2017/04/04
By   : CharlotteHonG
Final: 2017/04/04
*****************************************************************/
#include <iostream>
using namespace std;

int add(int a, int b){
    return a+b;
}
int sub(int a, int b){
    return a-b;
}

// 為宣告建立別名
// typedef int (*p)(int, int);
// using p = int (*)(int, int);

// 搭配 decltype
// typedef decltype(add) *p;
using p = decltype(add);

// 使用 p 宣告
int fun(int a, int b, p fun_point){
    return (*fun_point)(a, b);
}
// 直接使用
int fun2(int a, int b, decltype(add) fun){
    return (*fun)(a, b);
}
//================================================================
int main(int argc, char const *argv[]){
    cout << fun(2, 3, &add) << endl;
    cout << fun(2, 3, &sub) << endl;

    // 主程式取別名
    auto p=add;
    cout << fun2(2, 3, p) << endl;

    return 0;
}
//================================================================

沒有留言:

張貼留言