【问题标题】:Can you pass a function so you can later call it?你可以传递一个函数以便以后调用它吗?
【发布时间】:2017-05-20 12:19:17
【问题描述】:

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

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
}

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

制造,TPrammus

【问题讨论】:

  • 你会想要使用std::function。
  • 您要传递给类的函数的签名是相同的还是应该接受int(int, int)、double(double) 和void(int) ...?
  • 你也可以使用function pointer。
  • @FrançoisAndrieux,看起来像简单的函数指针就可以了,这样效率更高,than std::function。
  • @SergeyA 也许,但std::function 是处理此类问题时了解的重要工具,即使它不适合您。

标签: c++ function class object


【解决方案1】:

您可以使用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

【讨论】:

  • 为什么是std::function?
  • 通用并允许捕获 lambda。
  • 但是 OP 需要它吗?有与之相关的成本。感谢您的编辑,顺便说一句
  • 非常感谢这个解决方案有效。我之前尝试过,但没有成功,因为没有人告诉我#include &lt;functional&gt;(我现在想通了)。
  • @SergeyA:我认为这将是过早的优化。但是指针确实也是可以的。
【解决方案2】:

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

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);
}

编译失败。

【讨论】:

  • 拒绝投票很酷。解释它的原因就更酷了。
猜你喜欢
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多