繁体   English   中英

是否可以使用其指针和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*testClass*如果您知道这就是事实,那么您将永远不需要将其变为void* ,对吗?

总体来说,像lambdas和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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM