``` std::function ```C++使用std::function模板封装函数有什么用
时间: 2024-01-27 15:05:49 浏览: 33
C++中的std::function是一个通用的函数封装器,它可以用来封装任意可调用对象(函数、函数指针、成员函数指针、lambda表达式等),并且可以在需要时进行调用。
使用std::function模板封装函数有以下几个用途:
1. 函数回调:可以将一个函数作为参数传递给另一个函数,通过std::function来保存和调用这个函数。这样可以实现回调机制,使得代码更加灵活和可扩展。
2. 函数对象的封装:可以将一个函数对象(包括lambda表达式)封装到std::function中,使得函数对象可以像普通函数一样被调用。
3. 函数指针的封装:可以将一个函数指针封装到std::function中,使得函数指针可以像普通函数一样被调用。
4. 实现类型擦除:当需要在容器中存储不同类型的可调用对象时,可以使用std::function来进行类型擦除,统一封装不同类型的可调用对象。
总之,使用std::function模板可以提供一种统一的接口来处理不同类型的可调用对象,使得代码更加灵活、可复用和可扩展。
相关问题
std::bind std::function 使用示例
下面是一个使用std::function和std::bind的示例:
```c++
#include <iostream>
#include <functional>
void printNum(int num) {
std::cout << "Number: " << num << std::endl;
}
int main() {
// 使用std::function定义一个函数对象
std::function<void(int)> funcObj;
// 使用std::bind绑定函数和参数,返回一个函数对象
funcObj = std::bind(&printNum, std::placeholders::_1);
// 调用函数对象
funcObj(123);
return 0;
}
```
上述代码中,我们首先定义了一个名为`printNum`的函数,该函数接受一个整数参数并将其打印到控制台上。然后,我们使用`std::function`定义了一个函数对象`funcObj`,该函数对象接受一个整数参数并不返回任何值。接下来,我们使用`std::bind`将`printNum`函数和占位符`std::placeholders::_1`绑定在一起,返回一个函数对象,并将该函数对象赋值给`funcObj`。最后,我们调用`funcObj`并传递一个整数参数123,该整数参数将被传递给`printNum`函数。
类成员函数怎么使用std::function
使用 `std::function` 封装类成员函数时,需要将类对象的指针或引用也一并封装到 `std::function` 对象中。具体做法是在 `std::function` 类型的模板参数中,将类对象的指针或引用作为第一个参数,函数签名作为第二个参数。
示例如下:
```c++
#include <iostream>
#include <functional>
class Foo {
public:
void func(int x, int y) {
std::cout << x + y << std::endl;
}
};
int main() {
Foo foo;
std::function<void(Foo*, int, int)> f = &Foo::func; // 将成员函数封装到 std::function 对象中
f(&foo, 1, 2); // 调用成员函数
return 0;
}
```
上述代码中,`std::function<void(Foo*, int, int)>` 表示一个接受三个参数,第一个参数是 `Foo*` 类型的指针或引用,第二个和第三个参数是 int 类型的可调用对象。`f` 对象封装了 `Foo` 类的成员函数 `func`,可以通过 `f` 对象调用该成员函数。在调用时,需要先传入类对象的指针或引用,再传入成员函数的参数。
需要注意的是,如果成员函数是 const 成员函数,则需要将 `std::function` 的模板参数改为 `void (Foo::*)(int, int) const`。同时,在创建 `std::function` 对象时,需要使用 `std::mem_fn` 函数将成员函数转换为函数对象。示例如下:
```c++
#include <iostream>
#include <functional>
class Foo {
public:
void func(int x, int y) const {
std::cout << x + y << std::endl;
}
};
int main() {
Foo foo;
std::function<void(const Foo*, int, int)> f = std::mem_fn(&Foo::func); // 将 const 成员函数封装到 std::function 对象中
f(&foo, 1, 2); // 调用 const 成员函数
return 0;
}
```