如何从 2 个 void 指针调用类成员函数

Posted

技术标签:

【中文标题】如何从 2 个 void 指针调用类成员函数【英文标题】:How to call a class member function from 2 void pointers 【发布时间】:2020-05-25 23:50:44 【问题描述】:

所以对于这个函数:

template<typename T>
T popObject(ScriptObject obj)  //Preforms a cast from void* on each to its type.
    assert(obj.getType() == std::type_index(typeid(T))); //Ensure type Safety.
    return obj.get<T>();


template <typename C, typename...Args>
    void bind(const char* name, C* context, void(C::* function)(Args...)) 
        std::vector<std::type_index> arguments =  std::type_index(typeid(Args))... ;
        auto functor = [](void* func,void* contex, std::vector<ScriptObject> stack) 
            std::size_t idx = 0;
            //Call class context -> function (Args...)
        ;
        _functions[name] = new BoundFunction(functor, void_cast(function), context, arguments);
    

我不确定调用成员函数的语法。

我试过了:

union MF
    void(C::* pf)(Args...);
    void* p;
 mf;
mf.p = func;
contex->*(mf.pf)(popObject<Args>(stack[idx++])...);

不编译,声明:“不评估为采用 1 个参数的函数。”

试过std::invoke,但我不知道如何为arg1指定成员函数签名。

所以如果我有一个成员函数的引用,还有一个类的实例的引用,还有模板信息去派生类型信息。如何调用 Classes 成员函数?

【问题讨论】:

在黑暗中拍摄,还在看,你试过popObject&lt;Args...&gt;吗?还是将static_cast&lt;C*&gt;(contex).* 更改为static_cast&lt;C*&gt;(contex)-&gt;?另外,您为什么要将 pf 转换为它已经存在的类型? (context-&gt;*(mf.pf))(...)。首先,它是-&gt;* 而不是.*,因为左边有一个指针。其次,注意context-&gt;*(mf.pf) 部分周围的括号。 @TheFloatingBrain 那不行,Args... 将使用每个参数评估为模板,我仍然希望 popObject 在每个单独的参数上运行。并且 -> 仅在成员函数名称已知时才有效。 @StevenVenham 抱歉误读,但您应该看看 Igor 的评论。此外,如果您的函数指针 pf 接受 Args... 是否 popObject 返回它从展开包中获得的类型? Ok 所以改成static_cast(ctx)->*(mf.pf)(popObject(stack[idx++])...);很好地调用了额外的静态演员 @TheFloatingBrain And Iv 将其更改为 ->* Igor 【参考方案1】:

感谢@Igor Tandentnik

最终解决方案是:

(static_cast<C*>(ctx)->*(mf.pf))(popObject<Args>(stack[idx++])...);

正如 Igor 指出的,它需要是 ->* 而不是 .*,并添加括号,因为 -> 的优先级低于函数调用运算符。

另外,感谢@TheFloatingBrain 指出额外的 static_cast

【讨论】:

以上是关于如何从 2 个 void 指针调用类成员函数的主要内容,如果未能解决你的问题,请参考以下文章

C++函数指针与成员函数指针

如何从另一个成员函数调用成员函数指针?

调用成员函数指针

如何使用指向类的成员函数的指针(详解!)

使用基类函数指针访问派生类成员函数

类成员函数指针