类成员函数怎么用std::function赋值?
时间: 2023-07-27 20:32:01 浏览: 112
理解C++编程中的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;
}
```
阅读全文