非静态void成员指针函数的向量与此

时间:2018-11-06 01:32:12

标签: c++ vector member-function-pointers

在C ++ 17中,如何使用this创建非静态成员指针函数的向量并随后调用这些函数?

Example.hpp

class Example{
    public:
        Example();

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

Example.cpp(伪代码)

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 :(得分:3)

您可以使用std::function代替指向成员的指针:

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

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

这使您可以概括向量以容纳静态成员函数或其他类型的函数。

答案 1 :(得分:3)

如果要坚持成员函数指针,应该是

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

并像调用它们一样

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

顺便说一句:作为Jans's answer的补充,您还可以将std::functionlambda一起使用,例如

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

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