将带或不带参数的函数作为C++中的参数传递

Pass function with or without argument as argument in C++

本文关键字:C++ 参数传递 函数 参数      更新时间:2023-10-16

我想将一个没有参数的 void 函数或一个带有参数的 void 函数作为参数传递给构造函数。喜欢这个:

DailyActivity activity1(&function1)

DailyActivity activity2(&function2(uint_t 1))

传递的函数应在调用DailyActivity::run()时触发。

DailyActivity的标题如下所示:

class DailyActivity {
  typedef void (*function_type)();
  public:
    DailyActivity(void (*f)());
    virtual void run();
  private:
    function_type m_function;
};

构造函数和 run() 函数如下所示:

DailyActivity::DailyActivity(void (*f)()) : m_function((*f)) {
}
DailyActivity::run() {
  m_function();
}

但是我没有设法 (1) 以正确的方式定义 typedef,使两个不同的函数被接受,以及 (2) 成功传递参数 o function2。

你不能

那样做。不幸的是,C++无法处理部分函数,因此您必须重载构造函数才能将函数和参数作为两个单独的参数,第二个参数来处理无参数参数。然后,您将有两个函数指针,其中一个应为 null。

另一种选择是将函数包装到 lambda 中。

您可以将std::functionlambdastd::bind一起使用:

class DailyActivity {
  public:
    explicit DailyActivity(std::function<void ()> f) : m_function(f) {}
    void run() { m_function(); }
  private:
    std::function<void ()> m_function;
};

并称它

DailyActivity activity1(&function1);
DailyActivity activity2([](){function2(1);});

现场示例