加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 绑定类方法并将其作为函数指针传递

发布时间:2020-12-16 07:22:04 所属栏目:百科 来源:网络整理
导读:我想将我的类方法作为参数传递给(第三方)函数 ?(listner – 无法更改)接受函数指针和void *.以下是一个例子: #include functionaltypedef void(*pfnc) (void*);struct Foo{ static void static_foo(void*) { } void foo(void*) { } void listner(pfnc f,voi
我想将我的类方法作为参数传递给(第三方)函数
?(listner – 无法更改)接受函数指针和void *.以下是一个例子:

#include <functional>

typedef void(*pfnc) (void*);

struct Foo
{
    static void static_foo(void*)
    {
    }

    void foo(void*)
    {
    }

    void listner(pfnc f,void* p)
    {
       f(p);
    }

    void test()
    {
        listner(static_foo); // works with static method

        auto f = [](void*) {};
        listner(f); // works with lambda

        std::function<void(void*)> stdf = std::bind(&Foo::foo,this,std::placeholders::_1);
        listner(stdf);  // does not compile with not static method
    }
};

不幸的是我的解决方案无法编译我需要改变什么?

解决方法

从回调信号的外观来看,监听器API将指向void的指针作为“用户定义的数据”.您可以将此作为数据和一个小的无状态代理函数传递给Foo上的处理程序:

typedef void(*pfnc) (void*);

struct Foo
{
    static void static_foo(void*)
    {
    }

    void foo()
    {
    }

    void listner(pfnc f,void* user_data)
    {

        // eventually calls
        f(user_data);
    }

    void test()
    {
        listner(static_foo,nullptr); // works with static method

        auto f = [](void*) {
        };
        listner(f,nullptr); // works with lambda

        listner([](void* pv)
        {
            reinterpret_cast<Foo*>(pv)->foo();
        },this);
    }

};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读