代码之家  ›  专栏  ›  技术社区  ›  ZeroZ30o

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

  •  -1
  • ZeroZ30o  · 技术社区  · 7 年前

    当只拥有一个对象实例时,是否可以用一个特定的对象实例调用一个成员函数 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"?
    }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Maxim Egorushkin    7 年前

    您需要将指针类型更改为 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);
    }
    
        2
  •  4
  •   Lightness Races in Orbit    7 年前

    不;你有两个问题:

    1. (&testClass::testFunction) .

    2. 对象指针的类型已被删除。你可以把它从 void* testClass* 无效*

    总的来说是一个魔术的结合,比如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);
    }
    

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