c++ - 如何从 2 个 void 指针调用类成员函数
问题描述
所以对于这个功能:
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 指定成员函数签名。
因此,如果我有对成员函数的引用,对类的实例的引用,以及对 Derive 类型信息的模板信息。如何调用 Classes 成员函数?
解决方案
谢谢@Igor Tandentnik
最终解决方案是:
(static_cast<C*>(ctx)->*(mf.pf))(popObject<Args>(stack[idx++])...);
正如 Igor 指出的那样,它需要是 ->* 而不是 .*,并添加了括号,因为 -> 的优先级低于函数调用运算符。
另外,感谢@TheFloatingBrain 指出额外的 static_cast
推荐阅读
- dart - fontFamily 属性在颤振中无法正常工作
- vba - 无法在 IE 中执行 javascript
- angularjs - React - ReactDOM.render 到稍后加载的 div
- c++ - 在编译时获取 C++03 上的数据成员类型
- android - 如何使用支持所有不同尺寸屏幕的 ConstraintLayout 对齐视图?
- html - Debug.log 文件出现
- c# - C# Windows 鼠标控制
- rust - 尝试在 Rust 程序中使用 &self
- sql - 在 SQL Server 查询中检索数据长度以及列和表
- macos - NS窗口。什么是窗口服务器和窗口设备?