#include <iostream>
// 普通函数声明和定义
int func_add(int a, int b) { return a + b; }
int main()
{
int a = 10;
int b = 20;
int sum = func_add(a, b);
std::cout << a << "+" << b << "is : " << sum << std::endl;
getchar();
return 0;
}
#include <iostream>
class Calcu
{
public:
int base = 20;
// 类的成员方法,参数包含this指针
int class_func_add(const int a, const int b) const { return this->base + a + b; };
// 类的静态成员方法,不包含this指针
static int class_static_func_add(const int a, const int b) { return a + b; };
};
int main(void)
{
Calcu obj;
int a = 10;
int b = 20;
// 类普通成员方法调用如下
obj.class_func_add(a, b);
// 类静态成员方法调用如下
obj.class_static_func_add(a, b);
Calcu::class_static_func_add(a, b);
getchar();
return 0;
}
class ImitateAdd
{
public:
int operator()(const int a, const int b) const { return a + b; };
};
int main()
{
// 首先创建一个仿函数对象,然后调用()运算符模拟函数调用
ImitateAdd imitate;
imitate(5, 10);
getchar();
return 0;
}
#include <iostream>
// 声明一个compute函数指针,函数参数为两个int型,返回值为int型
int (*compute)(int, int);
int max(int x, int y) { return x >= y ? x : y; }
int min(int x, int y) { return x <= y ? x : y; }
int add(int x, int y) { return x + y; }
int multiply(int x, int y) { return x * y; }
// 一个包含函数指针作为回调的函数
int compute_x_y(int x, int y, int(*compute)(int, int))
{
// 调用回调函数
return compute(x, y);
}
int main(void)
{
int x = 2;
int y = 5;
std::cout << "max: " << compute_x_y(x, y, max) << std::endl; // max: 5
std::cout << "min: " << compute_x_y(x, y, min) << std::endl; // min: 2
std::cout << "add: " << compute_x_y(x, y, add) << std::endl; // add: 7
std::cout << "multiply: " << compute_x_y(x, y, multiply) << std::endl; // multiply: 10
// 无捕获的lambda可以转换为同类型的函数指针
auto sum = [](int x, int y)->int{ return x + y; };
std::cout << "sum: " << compute_x_y(x, y, sum) << std::endl; // sum: 7
getchar();
return 0;
}
Lambda函数
Lambda函数定义
Lambda函数,又可以称为Lambda表达式或者匿名函数,在C++11中加入标准。定义形式如下:
[captures] (params) -> return_type { statments;}
其中:
[captures]为捕获列表,用于捕获外层变量
(params)为匿名函数参数列表
->return_type指定匿名函数返回值类型
{ statments; }部分为函数体,包括一系列语句
需要注意:
当匿名函数没有参数时,可以省略(params)部分
当匿名函数体的返回值只有一个类型或者返回值为void时,可以省略->return_type部分
定义匿名函数时,一般使用auto作为匿名函数类型
下面都是有效的匿名函数定义
auto func1 = [](int x, int y) -> int { return x + y; };
auto func2 = [](int x, int y) { return x > y; }; // 省略返回值类型
auto func3 = [] { global_ip = 0; }; // 省略参数部分
Lambda函数捕获列表
为了能够在Lambda函数中使用外部作用域中的变量,需要在[]中指定使用哪些变量。
下面是各种捕获选项:
[] 不捕获任何变量
[&] 捕获外部作用域中所有变量,并作为引用在匿名函数体中使用
[=] 捕获外部作用域中所有变量,并拷贝一份在匿名函数体中使用
[x, &y] x按值捕获, y按引用捕获
[&, x] x按值捕获. 其它变量按引用捕获
[=, &y] y按引用捕获. 其它变量按值捕获
[this] 捕获当前类中的this指针,如果已经使用了&或者=就默认添加此选项
只有lambda函数没有指定任何捕获时,才可以显式转换成一个具有相同声明形式函数指针
auto lambda_func_sum = [](int x, int y) { return x + y; }; // 定义lambda函数
void (*func_ptr)(int, int) = lambda_func_sum; // 将lambda函数赋值给函数指针
func_ptr(10, 20); // 调用函数指针
#include <iostream>
#include <functional>
std::function<int(int, int)> SumFunction;
// 普通函数
int func_sum(int a, int b)
{
return a + b;
}
class Calcu
{
public:
int base = 20;
// 类的成员方法,参数包含this指针
int class_func_sum(const int a, const int b) const { return this->base + a + b; };
// 类的静态成员方法,不包含this指针
static int class_static_func_sum(const int a, const int b) { return a + b; };
};
// 仿函数
class ImitateAdd
{
public:
int operator()(const int a, const int b) const { return a + b; };
};
// lambda函数
auto lambda_func_sum = [](int a, int b) -> int { return a + b; };
// 函数指针
int (*func_pointer)(int, int);
int main(void)
{
int x = 2;
int y = 5;
// 普通函数
SumFunction = func_sum;
int sum = SumFunction(x, y);
std::cout << "func_sum:" << sum << std::endl;
// 类成员函数
Calcu obj;
SumFunction = std::bind(&Calcu::class_func_sum, obj,
std::placeholders::_1, std::placeholders::_2); // 绑定this对象
sum = SumFunction(x, y);
std::cout << "Calcu::class_func_sum:" << sum << std::endl;
// 类静态函数
SumFunction = Calcu::class_static_func_sum;
sum = SumFunction(x, y);
std::cout << "Calcu::class_static_func_sum:" << sum << std::endl;
// lambda函数
SumFunction = lambda_func_sum;
sum = SumFunction(x, y);
std::cout << "lambda_func_sum:" << sum << std::endl;
// 带捕获的lambda函数
int base = 10;
auto lambda_func_with_capture_sum = [&base](int x, int y)->int { return x + y + base; };
SumFunction = lambda_func_with_capture_sum;
sum = SumFunction(x, y);
std::cout << "lambda_func_with_capture_sum:" << sum << std::endl;
// 仿函数
ImitateAdd imitate;
SumFunction = imitate;
sum = SumFunction(x, y);
std::cout << "imitate func:" << sum << std::endl;
// 函数指针
func_pointer = func_sum;
SumFunction = func_pointer;
sum = SumFunction(x, y);
std::cout << "function pointer:" << sum << std::endl;
getchar();
return 0;
}
最后的输出如下:
func_sum:7
Calcu::class_func_sum:27
Calcu::class_static_func_sum:7
lambda_func_sum:7
lambda_func_with_capture_sum:17
imitate func:7
function pointer:7
#include <iostream>
#include <functional>
std::function<int(int, int)> ComputeFunction;
int (*compute_pointer)(int, int);
int compute1(int x, int y, ComputeFunction func) {
// do something
return func(x, y);
}
int compute2(int x, int y, compute_pointer func)
{
// do something
return func(x, y);
}
// 调用方式参考上面关于函数指针和std::function的例子
#include <iostream>
// 普通函数声明和定义
int func_add(int a, int b) { return a + b; }
int main()
{
int a = 10;
int b = 20;
int sum = func_add(a, b);
std::cout << a << "+" << b << "is : " << sum << std::endl;
getchar();
return 0;
}
#include <iostream>
class Calcu
{
public:
int base = 20;
// 类的成员方法,参数包含this指针
int class_func_add(const int a, const int b) const { return this->base + a + b; };
// 类的静态成员方法,不包含this指针
static int class_static_func_add(const int a, const int b) { return a + b; };
};
int main(void)
{
Calcu obj;
int a = 10;
int b = 20;
// 类普通成员方法调用如下
obj.class_func_add(a, b);
// 类静态成员方法调用如下
obj.class_static_func_add(a, b);
Calcu::class_static_func_add(a, b);
getchar();
return 0;
}
class ImitateAdd
{
public:
int operator()(const int a, const int b) const { return a + b; };
};
int main()
{
// 首先创建一个仿函数对象,然后调用()运算符模拟函数调用
ImitateAdd imitate;
imitate(5, 10);
getchar();
return 0;
}
#include <iostream>
// 声明一个compute函数指针,函数参数为两个int型,返回值为int型
int (*compute)(int, int);
int max(int x, int y) { return x >= y ? x : y; }
int min(int x, int y) { return x <= y ? x : y; }
int add(int x, int y) { return x + y; }
int multiply(int x, int y) { return x * y; }
// 一个包含函数指针作为回调的函数
int compute_x_y(int x, int y, int(*compute)(int, int))
{
// 调用回调函数
return compute(x, y);
}
int main(void)
{
int x = 2;
int y = 5;
std::cout << "max: " << compute_x_y(x, y, max) << std::endl; // max: 5
std::cout << "min: " << compute_x_y(x, y, min) << std::endl; // min: 2
std::cout << "add: " << compute_x_y(x, y, add) << std::endl; // add: 7
std::cout << "multiply: " << compute_x_y(x, y, multiply) << std::endl; // multiply: 10
// 无捕获的lambda可以转换为同类型的函数指针
auto sum = [](int x, int y)->int{ return x + y; };
std::cout << "sum: " << compute_x_y(x, y, sum) << std::endl; // sum: 7
getchar();
return 0;
}
Lambda函数
Lambda函数定义
Lambda函数,又可以称为Lambda表达式或者匿名函数,在C++11中加入标准。定义形式如下:
[captures] (params) -> return_type { statments;}
其中:
[captures]为捕获列表,用于捕获外层变量
(params)为匿名函数参数列表
->return_type指定匿名函数返回值类型
{ statments; }部分为函数体,包括一系列语句
需要注意:
当匿名函数没有参数时,可以省略(params)部分
当匿名函数体的返回值只有一个类型或者返回值为void时,可以省略->return_type部分
定义匿名函数时,一般使用auto作为匿名函数类型
下面都是有效的匿名函数定义
auto func1 = [](int x, int y) -> int { return x + y; };
auto func2 = [](int x, int y) { return x > y; }; // 省略返回值类型
auto func3 = [] { global_ip = 0; }; // 省略参数部分
Lambda函数捕获列表
为了能够在Lambda函数中使用外部作用域中的变量,需要在[]中指定使用哪些变量。
下面是各种捕获选项:
[] 不捕获任何变量
[&] 捕获外部作用域中所有变量,并作为引用在匿名函数体中使用
[=] 捕获外部作用域中所有变量,并拷贝一份在匿名函数体中使用
[x, &y] x按值捕获, y按引用捕获
[&, x] x按值捕获. 其它变量按引用捕获
[=, &y] y按引用捕获. 其它变量按值捕获
[this] 捕获当前类中的this指针,如果已经使用了&或者=就默认添加此选项
只有lambda函数没有指定任何捕获时,才可以显式转换成一个具有相同声明形式函数指针
auto lambda_func_sum = [](int x, int y) { return x + y; }; // 定义lambda函数
void (*func_ptr)(int, int) = lambda_func_sum; // 将lambda函数赋值给函数指针
func_ptr(10, 20); // 调用函数指针
#include <iostream>
#include <functional>
std::function<int(int, int)> SumFunction;
// 普通函数
int func_sum(int a, int b)
{
return a + b;
}
class Calcu
{
public:
int base = 20;
// 类的成员方法,参数包含this指针
int class_func_sum(const int a, const int b) const { return this->base + a + b; };
// 类的静态成员方法,不包含this指针
static int class_static_func_sum(const int a, const int b) { return a + b; };
};
// 仿函数
class ImitateAdd
{
public:
int operator()(const int a, const int b) const { return a + b; };
};
// lambda函数
auto lambda_func_sum = [](int a, int b) -> int { return a + b; };
// 函数指针
int (*func_pointer)(int, int);
int main(void)
{
int x = 2;
int y = 5;
// 普通函数
SumFunction = func_sum;
int sum = SumFunction(x, y);
std::cout << "func_sum:" << sum << std::endl;
// 类成员函数
Calcu obj;
SumFunction = std::bind(&Calcu::class_func_sum, obj,
std::placeholders::_1, std::placeholders::_2); // 绑定this对象
sum = SumFunction(x, y);
std::cout << "Calcu::class_func_sum:" << sum << std::endl;
// 类静态函数
SumFunction = Calcu::class_static_func_sum;
sum = SumFunction(x, y);
std::cout << "Calcu::class_static_func_sum:" << sum << std::endl;
// lambda函数
SumFunction = lambda_func_sum;
sum = SumFunction(x, y);
std::cout << "lambda_func_sum:" << sum << std::endl;
// 带捕获的lambda函数
int base = 10;
auto lambda_func_with_capture_sum = [&base](int x, int y)->int { return x + y + base; };
SumFunction = lambda_func_with_capture_sum;
sum = SumFunction(x, y);
std::cout << "lambda_func_with_capture_sum:" << sum << std::endl;
// 仿函数
ImitateAdd imitate;
SumFunction = imitate;
sum = SumFunction(x, y);
std::cout << "imitate func:" << sum << std::endl;
// 函数指针
func_pointer = func_sum;
SumFunction = func_pointer;
sum = SumFunction(x, y);
std::cout << "function pointer:" << sum << std::endl;
getchar();
return 0;
}
最后的输出如下:
func_sum:7
Calcu::class_func_sum:27
Calcu::class_static_func_sum:7
lambda_func_sum:7
lambda_func_with_capture_sum:17
imitate func:7
function pointer:7
#include <iostream>
#include <functional>
std::function<int(int, int)> ComputeFunction;
int (*compute_pointer)(int, int);
int compute1(int x, int y, ComputeFunction func) {
// do something
return func(x, y);
}
int compute2(int x, int y, compute_pointer func)
{
// do something
return func(x, y);
}
// 调用方式参考上面关于函数指针和std::function的例子