目錄
- 仿函式類
- 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);