Вектор не статических функций указателя на пустой элемент с этим - PullRequest
0 голосов
/ 06 ноября 2018

В C ++ 17, как создать вектор нестатических функций-указателей на член с помощью this и впоследствии вызвать функции?

Example.hpp

class Example{
    public:
        Example();

        void function1();
        void function2();
};

Example.cpp (psuedocode)

Example::Example(){
    std::vector<void (*)()> vectorOfFunctions;
    vectorOfFunctions.push_back(&this->function1);
    vectorOfFunctions.push_back(&this->function2);

    vectorOfFunctions[0]();
    vectorOfFunctions[1]();
}

void Example::Function1(){
    std::cout << "Function 1" << std::endl;
}

void Example::Function2(){
    std::cout << "Function 2" << std::endl;
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Если вы хотите придерживаться указателя на функцию-член, он должен быть

std::vector<void (Example::*)()> vectorOfFunctions;
//                ^^^^^^^^^
vectorOfFunctions.push_back(&Example::function1);
vectorOfFunctions.push_back(&Example::function2);

И вызывать их как

(this->*vectorOfFunctions[0])();
(this->*vectorOfFunctions[1])();

Кстати: в качестве дополнения к ответу Янса вы также можете использовать std::function с лямбда , например,

std::vector<std::function<void ()>> vectorOfFunctions;
vectorOfFunctions.push_back([this]() { this->function1(); });
vectorOfFunctions.push_back([this]() { this->function2(); });

vectorOfFunctions[0]();
vectorOfFunctions[1]();
0 голосов
/ 06 ноября 2018

Вы можете использовать std::function вместо указателя на элементы:

std::vector<std::function<void()>> vectorOfFunctions;

vectorOfFunctions.push_back(std::bind(&Example::function1, this));
vectorOfFunctions.push_back(std::bind(&Example::function2, this));

Это позволяет обобщить вектор для хранения статических функций-членов или функций другого типа.

...