如何从2个无效指针中调用类成员函数

问题描述 投票:0回答:1

因此使用此功能:

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);
    }

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

IV已尝试:

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

不会编译,但声明:“不评估带有1个参数的函数。”

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

因此,如果我有对成员函数的引用,以及对类实例的引用,以及对派生类型信息的模板信息。如何调用Classes成员函数?

c++ pointers member-function-pointers
1个回答
0
投票

感谢@Igor Tandentnik

最终解决方案是:

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

正如Igor所指出的,它必须是-> *而不是。*,并加上括号,因为->的优先级低于Function调用运算符。

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

© www.soinside.com 2019 - 2024. All rights reserved.