在使用libev的ev++.h中的接口时,看到一些很实用的技术,其中就有本篇要介绍的method_thunk
(注: 本篇博客仅作为学习笔记)
在以往,我们使用了某些基于C语言的库时,需要用到回调函数, 比如pthread库。如果要在C++中使用这些库来绑定我们的某个类的成员函数作为回调时,我们通常会使用诸如
class Some
{
public:
void doSomething() {
// TODO:
}
static void *func(void *pArgs);
};
void *Some::func(void *pArgs)
{
auto some = static_cast<Some*>(pArgs);
some->doSomething();
}
// 使用的时候
int main(int argc, char **argv)
{
Some some;
pthread_t pid;
pthread_create(&pid, nullptr, &Some::func, &some);
pthread_join(pid, nullptr);
return 0;
}
不过在libev的ev++.h头文件里面又学到了新的方法method_thunk
#include <pthread.h>
template<class T, void (T::*method)()>
void *method_thunk(void *pArgs)
{
(static_cast<T *>(pArgs)->*method)();
}
template<class T>
void *method_thunk(void *pArgs)
{
method_thunk<T, &T::operator()>(pArgs);
}
//以下是使用方法
class Other
{
public:
void operator()() {
std::cout << "调用了操作符重载operator()" << std::endl;
}
void doSomething() {
std::cout << "调用了普通的成员函数" << std::endl;
}
};
int main(int argc, char **argv)
{
pthread_t pid1;
pthread_t pid2;
Other other;
pthread_create(&pid1, nullptr, method_thunk<Other>, &other);
pthread_create(&pid2, nullptr, method_thunk<Other, &Other::doSomething>, &other);
pthread_join(pid1, nullptr);
pthread_join(pid2, nullptr);
return 0;
}
这样看起来比定义一个成员函数简洁很多了, 不用每次定义一个类就要定义一个对应的static 函数了,哈哈, 懒人就要用懒法子, 当然啦,这种方式一般只适合带有void *类型参数的回调方法,哈哈,想要一劳永逸那是不可能滴