cpp:"函式指標"的方法

Getone超發表於2024-03-14

目錄
  • 仿函式類
  • std::function類
  • Lambda類
  • lambda函式

函式物件有這幾類:

仿函式類

即過載operator()

class FuncObjType
{
public:
    void operator() ()
    {
        cout<<"Hello C++!"<<endl;
    }
};

std::function類

即上文中func_type

std::function<float(float,float)>  func;// 等同於 int (*func)(int a, int b);//func是一個變數

//仿函式賦值
func= std::fmaxf; //等同於func=addFunc;

//一般函式賦值
func=std::bind(&類名::函式名,類物件,_1,_2);

// 儲存到成員函式的呼叫
std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
const Foo foo(314159);
f_add_display(foo, 1);
f_add_display(314159, 1);


std::function做形參

void function(std::function<flaot(float,float)> FUNC, other)

Lambda類

[ 捕獲 ] ( 形參列表 )(可選) lambda說明符 { 函式體 }

lambda函式

Lambda 表示式 (C++11 起) - cppreference.com

[ 捕獲 ] ( 形參列表 )(可選) lambda說明符 { 函式體 }

捕獲

  • [] 什麼也不捕獲,無法lambda函式體使用任何

  • [=] 按值的方式捕獲所有變數,這個值是const型別的,lambda函式體中不可有直接修改這個值的操作

  • [&] 按引用的方式捕獲所有變數

  • [=, &a] 除了變數a之外,按值的方式捕獲所有區域性變數,變數a使用引用的方式來捕獲。這裡可以按引用捕獲多個,例如 [=, &a, &b,&c]。這裡注意,如果前面加了=,後面加的具體的引數必須以引用的方式來捕獲,否則會報錯。

  • [&, a] 除了變數a之外,按引用的方式捕獲所有區域性變數,變數a使用值的方式來捕獲。這裡後面的引數也可以多個,例如 [&, a, b, c]。這裡注意,如果前面加了&,後面加的具體的引數必須以值的方式來捕獲。

  • [a, &b] 以值的方式捕獲a,引用的方式捕獲b,也可以捕獲多個。

  • [this] 在成員函式中,也可以直接捕獲this指標,其實在成員函式中,[=]和[&]也會捕獲this指標。

案例

int x = 1; int y = 2;
auto plus = [=] (int a, int b) -> int { return x + y + a + b; };
int c = plus(1, 2);

相關文章