C++模板技术之method_thunk, 使用场景: C++中类成员函数作为回调函数

在使用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 *类型参数的回调方法,哈哈,想要一劳永逸那是不可能滴

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值