是否可以使用其指针和 void 对象指针来调用成员函数?

Is it possible to call a member function with its pointer and a void object pointer?

只有void*指向特定实例的指针和returnType(*function)(parameters)函数指针时,是否可以调用具有特定对象实例的成员函数?

#include <iostream>
class testClass
{
    public:
    int classNum;
    testClass(int _num) : classNum(_num) {}
    void testFunction(int _num) { std::cout << _num + classNum << "\n"; }
};

int main()
{
    testClass instance(3);

    void(*function)(int) = (&testClass::testFunction); // edit: this is wrong, but "&test::testFunction" is the information provided nonetheless
    void* instancePtr = (void*)&instance;

    // can we call "testFunction(3)" on "instance" with only "function" and "instancePtr"?
}

否;你有两个问题:

  1. 指向成员函数的指针类型错误,不会绑定到 (&testClass::testFunction)

  2. 对象指针的类型已被擦除。如果你知道它是什么,你可以将它从 void* 转换回 testClass*,但是你永远不需要它是 void*,对吗?

总的来说,像 lambda 和 std::function 这样的魔术组合会更优越。

这里有一些魔法:

int main()
{
    testClass instance(3);

    std::function<void(void*, int)> f = [](void* instancePtr, int _num) {
        static_cast<testClass*>(instancePtr)->testFunction(_num);
    };

    void* instancePtr = &instance;
    f(instancePtr, 42);
}

不过,您的选择实际上取决于您要做什么。

您需要将指针类型更改为void(*function)(void*, int),以便它可以接受指向对象的指针和参数。示例:

int main() {
    testClass instance(3);
    void(*function)(void*, int) = [](void* p, int a) { static_cast<testClass*>(p)->testFunction(a); };
    void* instancePtr = &instance;
    function(instancePtr, 3);
}