简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:理解C++之std::function类模板定义函数对象用法。
2.std::function类模板定义函数对象介绍
函数对象概念:
-
函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是std::function定义的函数对象。函数对象(也称“函数符”)是重载了“()”操作符的普通类对象。从语法上讲,函数对象与普通的函数行为类似。
-
std::function是一组函数对象包装类的模板,实现了一个泛型的回调机制。function与函数指针比较相似,它既可以是普通函数,也可以是函数对象和类的成员函数。
-
C++中的
functional
库提供了一种通用的方式来接收任意可调用对象,包括函数指针、函数对象、Lambda表达式等 -
函数对象是指能像函数一样被调用的对象。
-
functional
头文件中提供了几个常用的函数对象,如std::function
、std::bind
、std::placeholder
等。 -
std::function
是一个通用的函数封装器,类似于函数指针,可以用来包装任意可调用的目标,如普通函数、函数指针、成员函数、lambda表达式等。通过std::function
,我们可以将函数对象作为一个参数传递给其他函数或者保存它们在容器中。 -
std::bind
是一个用于创建函数对象的工具函数,它可以将一个可调用对象和其参数绑定在一起,生成一个新的函数对象。这样,我们可以在调用这个新的函数对象时,只需提供未绑定的参数,而不需要再传递所有的参数。 -
std::placeholder
是一个占位符,用于表示绑定参数的位置。在使用std::bind
函数时,我们可以使用std::placeholder
来指定不同位置上的参数。
3.std::function类模板实例
<1>. 使用函数指针:
#include <iostream>
#include <functional>
void foo() {
std::cout << "Hello, world!\n";
}
int main() {
std::function<void()> func = &foo; // 使用函数指针初始化std::function对象
func(); // 调用函数指针所指向的函数
return 0;
}
<2>. 使用函数对象:
#include <iostream>
#include <functional>
struct Foo {
void operator()() {
std::cout << "Hello, world!\n";
}
};
int main() {
std::function<void()> func = Foo(); // 使用函数对象初始化std::function对象
func(); // 调用函数对象的operator()函数
return 0;
}
<3>. 使用Lambda表达式:
#include <iostream>
#include <functional>
int main() {
std::function<void()> func = []() { // 使用Lambda表达式初始化std::function对象
std::cout << "Hello, world!\n";
};
func(); // 调用Lambda表达式代表的函数
return 0;
}
<4>. 使用成员函数:
#include <iostream>
#include <functional>
struct Foo {
void bar() {
std::cout << "Hello, world!\n";
}
};
int main() {
Foo foo;
std::function<void()> func = std::bind(&Foo::bar, &foo); // 使用std::bind绑定成员函数和对象
func(); // 调用绑定的成员函数
return 0;
}
<5>. 使用成员函数和成员变量:
#include <iostream>
#include <functional>
struct Foo {
int value;
void bar() {
std::cout << "Value: " << value << "\n";
}
};
int main() {
Foo foo;
foo.value = 42;
std::function<void()> func = std::bind(&Foo::bar, &foo); // 使用std::bind绑定成员函数和对象
func(); // 调用绑定的成员函数
return 0;
}
<6>. 使用函数对象和参数:
#include <iostream>
#include <functional>
struct Add {
int operator()(int a, int b) {
return a + b;
}
};
int main() {
std::function<int(int, int)> func = Add(); // 使用函数对象初始化std::function对象,并指定参数和返回值类型
int result = func(2, 3); // 调用函数对象重载的()运算符
std::cout << "Result: " << result << "\n";
return 0;
}
<7>. 使用Lambda表达式和参数:
#include <iostream>
#include <functional>
int main() {
std::function<int(int, int)> func = [](int a, int b) { // 使用Lambda表达式初始化std::function对象,并指定参数和返回值类型
return a + b;
};
int result = func(2, 3); // 调用Lambda表达式代表的函数
std::cout << "Result: " << result << "\n";
return 0;
}