我正在尝试传递一个函数指针(类型为QScriptEngine::FunctionSignature
(= QScriptValue (QScriptContext *, QScriptEngine *)
)) 到另一个函数。但我需要传递的函数是类的成员函数。
我这样使用它:
class MyClass
{
SomeVarType someVarINeedAccessTo;
QScriptValue print(QScriptContext* context, QScriptEngine* engine)
{
... someVarINeedAccessTo ...
}
void someFunction()
{
QScriptEngine engine;
QScriptValue printFunction = engine.newFunction(print);
engine.globalObject().setProperty("print", printFunction);
}
};
通过这个例子我得到了错误:
error: no matching function for call to QScriptEngine::newFunction(<unresolved overloaded function type>)
note: candidates are: ...
如何将 print 函数传递给 newFunction?
EDIT:
我是这样修复的:
class MyClass
{
public:
...
class TheEngine : public QScriptEngine
{
public:
MyClass* instance;
};
static QScriptValue print(QScriptContext *context, QScriptEngine *engine);
void someFunction();
...
};
Myclass::someFunction()
{
TheEngine engine;
...
QScriptVaue printFunction = engine.createFunction(print);
engine.globalObject().setProperty("print", printFunction);
...
}
QScriptValue MyClass::print(QScriptContext* context, QScriptEngine* engine)
{
TheEngine* eng = dynamic_cast<TheEngine*>(engine);
eng->instance->doSomething(...);
return engine->undefinedValue();
}
这是行不通的,因为函数不是方法,所以签名是不同的。与其他语言不同,在 C++ 中,方法不绑定到对象,因此它作为方法的签名,需要应用于对象。
您应该做的是用良好的签名包装一个适当的函数(或静态函数),并在作为参数传递的对象上调用您想要的方法。
like
MyClass : public QScriptEngine {
static QScriptValue static_print(QScriptContext* context, QScriptEngine* engine)
{
MyClass *my_engine = dynamic_cast<MyClass>(engine)
my_engine->print(context);
}
// redefine print to take only one argument.
}
也许您希望将 your_class 作为上下文的属性传递,而不是作为引擎,但这就是想法。您的方法需要一个静态包装器,并在参数中的某个位置使用对象来应用您的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)