【问题标题】:How to convert void (myClass::*)() to void (*)()如何将 void (myClass::*)() 转换为 void (*)()
【发布时间】:2018-02-24 00:02:18
【问题描述】:

我目前正在使用虚幻引擎开发一个 C++ 项目,但我无法解决这个问题。

class A
{
public: 
    void (* array[10])();

    //Add Function to an array
    void AddFunctionToArray(void(*function)());
};

class B
{
public: 

    A a;

    //Sending a B function to A
    void SendMyFunction();
    void Foo();
};

void B::SendMyFunction()
{
   a.AddFunctionToArray(&B::Foo);
}

我收到错误:can't convert void (B::*)() to void (*)()

如何将函数指针从我的一个类发送到另一个类?

【问题讨论】:

  • 您可能希望使用 std::vector 而不是 C 样式的数组。
  • B::Foo 需要 B 才能运行。虚幻引擎没有B,所以它不能调用它。制作B::Foo static 或使其成为B 之外的免费函数,这样它就不需要B
  • 如果 Unreal API 提供了一个“闭包”值,该值被传递回回调(例如,在 C API 中,它通常类似于 void *data),那么您可以传递一个指向包含 @ 的小结构的指针987654332@ 和 (B::*)(),然后使回调成为一个包装函数,它将 void *data 闭包指针转换回您的结构,然后调用适当的函数。 (或者更简单地说,将它们绑定到一个 lambda 对象中,将其粘贴到一个 std::function 对象中,然后让回调将 void *data 转换为 std::function 类型并调用它。)

标签: c++ function pointers unreal-engine4


【解决方案1】:

void (B::*)() 是指向非静态成员函数的指针,而void (*)() 是指向非成员函数的指针。两者之间没有转换。

B::Foo 设为静态可以解决此问题。但是,您将无权访问 B 的实例成员。

请注意,使用函数指针(成员或非成员)是传递函数对象的旧方式。一种更现代的方法是使用 std::function 对象,它可以由对象及其成员函数之一的组合构成。

【讨论】:

    【解决方案2】:

    如果你想让 A 类执行任意 X 类的方法,你可以试试这个:

    template <typename UserClass>
    void A::FireMethod(UserClass* InUserObject, typename TMemFunPtrType<false, UserClass, void(int)>::Type InFunc)
    {
        (InUserObject->*InFunc)(15);
    }
    

    在这种情况下,我们使用单个 int 作为参数调用函数。 B 类可以这样做:

    A* a = myAObject;
    a->FireMethod(this, &B::MyMethod);
    

    void B::MyMethod(int) {}
    

    希望对您有所帮助!如果您想了解更多信息,在虚幻引擎中您可以查看 Delegate.h 中的 AddDynamic 宏

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      相关资源
      最近更新 更多