最近在使用一个C语言库函数的时候,遇到一个问题:
该库函数有些函数设置了回调函数,
我构造了C++类, 想用其成员函数作为回调函数的参数赋值,
因为类方法有一个隐含参数this指针,无法直接作为回调使用,就想到了使用bind方法进行函参适配。结果证明是不可行的。
查阅了很多资料,
得
出
结
论
\color{red}{得出结论}
得出结论:
C语言的函数指针无法进行 C++ std::bind函数适配。😞
只用C++的std::function<函数类型>才能进行std::bind函数适配。
1 C普通回调函数实现
- 定义函数类型指针
- 在其他函数中使用该类型作为回调函数参数
#include <stdio.h>
typedef int (*callBack) (int a, int b);
callBack cfun;
int two_plus(int a, int b)
{
return a + b;
}
void set_call_back(callBack func)
{
cfunc = func;
}
int main()
{
set_call_back(&two_plus);
cfunc(1,2);
}
2 C++普通函数的回调方法
- 使用decltype也可以声明函数类型,作用同C语言的函数指针
- 使用C++ STL库 functional 的
std::funtion<函数类型> 作为参数类型,既可以做回调函数参数,又可以进行std::bind 函数绑定——将不同参数的函数进行参数适配。
#include <iostream>
#include <functional>
int two_plus(int a, int b)
{
return a + b;
}
int three_plus(int a, int b, int c)
{
return a+b+c;
}
- 使用decltype 方法,可以进行参数回调,但是无法将接受三参数的函数适配到函数参数中使用。
void cpp_set_call_back(decltype(two_plus) func)
{
}
int main()
{
cpp_set_call_back(&two_plus);
int x = 3;
cpp_set_call_back(std::bind(&three_plus,placeholders::_1, placeholders::_2, x));
}
- 使用
std::function<int (int, int)> 方法,可以使用bind方法,将三参数函数适配到二参数的函数上。 其中,placeholders::_1,::_2是匹配位,作用是将 three_plus第一个参数 和第二个参数作为原函数的参数1和参数2。
void cpp_set_call_back(std::function<int(int, int)> func)
{
}
int main()
{
cpp_set_call_back(&two_plus);
int x = 3;
cpp_set_call_back(std::bind(&three_plus,placeholders::_1, placeholders::_2, x));
}
3 C++ 类成员函数作为回调函数使用
C++ 成员函数都有一个隐含参数this指针 .如下的int ClassA::plus(int a, int b) 函数, 其实作为回调,其应当接受三个参数即:int ClassA::plus(ClassA *this, int a, int b)
#include <iostream>
#include <functional>
class ClassA {
public:
ClassA();
void set_class_call_back(std::function<int(int, int)> func)
{m_func = func;}
int plus(int a, int b) {return a + b;}
std::function<int(int, int)> m_func;
};
ClassA::ClassA()
{
set_class_call_back(std::bind(&ClassA::plus, this, placeholders::_1, placeholders::_2));
}
int main()
{
ClassA a;
a.set_class_call_back(std::bind(&ClassA::plus, &a, placeholders::_1, placeholders::_2));
}
|