Как вызвать любую функцию класса, используя ее указатель, если мы знаем аргументы и возвращаемый тип? - PullRequest
2 голосов
/ 25 марта 2020

Как создать указатель на функцию класса, которая знает только аргументы и тип возвращаемого значения? Как вызвать эту функцию позже?

Я читал о std :: function, однако я не представляю, как реализовать ее без использования указанного c имени класса, например "std::function<void(const ClassName&, int)> f_add_display = &ClassName::func;"

Пример ниже НЕ для компиляции, он только для того, чтобы показать идею, которую я имею в виду:

class collection {
    p* ...; //pointer to any(!) class function with known arguments and return type
} _collection;

class One {
public:
    ...
    bool Foo_1(int, int) {};
    void saveFuncAddr() {_collection.p = this::Foo_1};
};

class Two {
public: 
    bool Foo_2(int, int) {};
    void saveFuncAddr() {_collection.p = this::Foo_2};
};

int main() {
    one* = new One();
    one->saveFuncAddr();
    bool res1 = (*_collection.p)(1, 2);

    two* = new Two();
    two->saveFuncAddr();
    bool res2 = (*_collection.p)(1, 2);
}

1 Ответ

1 голос
/ 25 марта 2020

Во-первых, идентификаторы, начинающиеся с подчеркивания, зарезервированы в глобальном пространстве имен , поэтому вам не следует объявлять имя типа _collection.

. Вы можете использовать лямбды, чтобы обернуть вашего члена функции:

#include <functional>

struct Collection {
    std::function<bool(int, int)> p; 
} collection;

class One {
public:
    bool Foo_1(int, int) {return true;}
    void saveFuncAddr() 
    {
        collection.p = [this](int a, int b){return this->Foo_1(a, b);};
    }
};

class Two {
public: 
    bool Foo_2(int, int) {return true;}
    void saveFuncAddr() 
    {
        collection.p = [this](int a, int b){return this->Foo_2(a, b);};
    }
};

int main() {
    auto one = new One();
    one->saveFuncAddr();
    bool res1 = (collection.p)(1, 2);
    delete one;

    auto two = new Two();
    two->saveFuncAddr();
    bool res2 = (collection.p)(1, 2);
    delete two;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...