std::bind使用时怎么调用其他类指针
时间: 2023-08-31 15:37:34 浏览: 40
在使用std::bind时,如果要调用其他类的指针,需要使用placeholders占位符进行占位,并在调用时传入实际的参数。例如:
假设有一个类A和一个类B,需要在类B中调用类A的某个成员函数,类A的指针为a_ptr,可以这样使用std::bind来绑定成员函数和对象指针:
```
class A {
public:
void func(int arg) {
// do something
}
};
class B {
public:
void call_a_func(A* a_ptr) {
auto func_ptr = std::bind(&A::func, a_ptr, std::placeholders::_1);
func_ptr(123); // 调用A的func函数,传入参数123
}
};
int main() {
A a;
B b;
b.call_a_func(&a);
return 0;
}
```
在上面的代码中,首先定义了类A和类B,其中类A定义了一个成员函数func,类B中定义了一个成员函数call_a_func,接受一个类A的指针作为参数。在call_a_func中,使用std::bind绑定了A的func函数和a_ptr指针,并使用placeholders占位符占位,最后调用func_ptr函数,传入实际的参数123,即可调用A的func函数。
相关问题
std::function和std::bind结合使用
std::function是一个通用的函数封装类,它可以用来存储任何可调用对象(函数、函数指针、成员函数、仿函数等),并且可以在需要时执行这些可调用对象。std::bind则是一个函数适配器,它可以将一个可调用对象(函数、函数指针、成员函数、仿函数等)和一些参数绑定起来,形成一个新的可调用对象。
std::function和std::bind可以结合使用,通过std::bind将一个可调用对象和一些参数绑定起来,然后将绑定后的可调用对象存储到std::function对象中。当需要调用该可调用对象时,只需要调用std::function对象即可。
以下是std::function和std::bind结合使用的示例代码:
```
#include <iostream>
#include <functional>
void foo(int a, int b, int c) {
std::cout << "a + b + c = " << a + b + c << std::endl;
}
class Bar {
public:
void bar(int a, int b, int c) {
std::cout << "a * b * c = " << a * b * c << std::endl;
}
};
int main() {
std::function<void()> f1 = std::bind(foo, 1, 2, 3);
f1(); // 输出:a + b + c = 6
Bar bar;
std::function<void()> f2 = std::bind(&Bar::bar, &bar, 4, 5, 6);
f2(); // 输出:a * b * c = 120
return 0;
}
```
std::bind可以不传类指针吗
可以的。在使用std::bind时,如果绑定的成员函数是静态成员函数,或者是非成员函数,就不需要传类指针了。
例如,假设有一个全局函数func和一个类A,A中有一个静态成员函数static_func,可以这样使用std::bind来绑定函数:
```
void func(int arg) {
// do something
}
class A {
public:
static void static_func(int arg) {
// do something
}
};
int main() {
auto func_ptr = std::bind(&func, std::placeholders::_1);
func_ptr(123); // 调用全局函数func,传入参数123
auto static_func_ptr = std::bind(&A::static_func, std::placeholders::_1);
static_func_ptr(123); // 调用A的静态成员函数static_func,传入参数123
return 0;
}
```
在上面的代码中,首先定义了一个全局函数func和一个类A,其中A定义了一个静态成员函数static_func。在main函数中,分别使用std::bind绑定了func函数和static_func函数,并使用placeholders占位符占位,最后调用对应的函数指针,并传入实际的参数,即可调用对应的函数。
需要注意的是,如果要绑定的是类的非静态成员函数,就必须传入类指针。