Можно ли вызвать функцию-член с указателем и указателем на пустой объект? - PullRequest
0 голосов
/ 24 октября 2018

Можно ли вызвать функцию-член с конкретным экземпляром объекта, если только у него есть 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 ]

0 голосов
/ 24 октября 2018

Вам нужно изменить тип указателя на 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);
}
0 голосов
/ 24 октября 2018

Нет;у вас есть две проблемы:

  1. Функция указателя на член имеет неправильный тип и не будет привязываться к (&testClass::testFunction).

  2. У указателя объекта был удален тип.Вы можете разыграть его с void* обратно на testClass*, если знаете, что это такое, но тогда вам бы никогда не понадобилось, чтобы оно было void*, верно?

В целомкомбинация магии, такой как лямбда и 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);
}

Хотя ваши варианты действительно зависят от того, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...