c++ - 在 C++ 中传递成员函数指针

标签 c++ qt pointer-to-member

我正在尝试将一个函数指针(类型为 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: ...

如何将打印函数传递给 newFunction?

编辑:

我是这样修复的:

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++中,方法不绑定(bind)到对象,因此它作为方法的签名,需要应用于对象。

您应该做的是包装一个具有良好签名的适当函数(或静态函数),并在作为参数传递的对象上调用您想要的方法。

喜欢

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 作为上下文的属性传递,而不是作为引擎传递,但这就是想法。您需要一个静态包装器到您的方法,并在对象的某个地方应用您的函数。

关于c++ - 在 C++ 中传递成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4257239/

相关文章:

c++ - 通过运行时索引访问派生类中基类的成员

c++ - 带 C++ 和 DirectInput 的 USB 操纵杆

c++ - QtCharts添加自定义轴

qt - 更改对话框窗口大小时使 QTableWidget 展开

qt - 如何获取小部件背景 QColor

c++ - 指向函数对象的成员函数指针

c++ - 错误 C2064 : term does not evaluate to a function taking 0 arguments

c++ - 清除 gtest 中的 HasFailure 标志

C++ 避免在使用 boost::weak_ptr 的成员函数中过度使用 lock()

c++ - std::vector 的 std::lower_bound 比 std::map::find 慢