你可以传递一个函数,以便稍后调用它吗?

时间:2017-01-05 20:09:06

标签: c++ function class object

我希望对象有一个调用函数的方法(但是每个对象都应该有不同的函数来调用)。我将通过展示一个例子来向您展示我的意思:

class Human
{
    public:
        void setMyFunction(void func);  // specify which function to call
        void callMyFunction();  // Call the specified function
};

void Human::setMyFunction(void func)    // ''
{
    myFunction = func;
}

void Human::callMyFunction()    // ''
{
    myFunction();
}

void someRandomFunction()   // A random function
{
    // Some random code
}

int main()
{
    Human Lisa;     // Create Object
    Lisa.setMyFunction();   // Set the function for that object
    Lisa.callMyFunction();  // Call the function specified earlier
}

这段代码(显然)不起作用,但我希望你能理解我想要完成的任务。

MfG,TPRammus

2 个答案:

答案 0 :(得分:5)

您可以使用std::function

#include <functional>

class Human
{
    std::function<void()> mFunc;
public:
    void setMyFunction(std::function<void()> func) { mFunc = func; }
    void callMyFunction() { if (mFunc) mFunc(); }
};

Demo

答案 1 :(得分:4)

我建议使用一个简单的函数指针。就这样做:

class Human
{
    public:
        using func_t = void (*)(); 
        void setMyFunction(func_t f) {
             func = f;
        }
        void callMyFunction() {
             func();
        }
     private:
        func_t func;
};

为什么人们可能更喜欢std::function的函数指针的原因是:

  • 性能。调用std::function往往比通过指针调用函数更慢。
  • 当需要将它绑定到重载函数时,
  • std::function需要真正丑陋的语法。

示例:

void foo();
void foo(int x = 0);

void check() {
  Human h;
  h.setMyFunction(&foo);
}

无法编译。