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

时间:2015-01-04 22:26:04

标签: c++

我想传递一个没有参数的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。

2 个答案:

答案 0 :(得分:2)

你做不到。不幸的是,C ++无法处理部分函数,​​所以你必须重载你的构造函数,将函数和参数作为两个单独的参数,第二个是处理无参数的参数。然后你将有两个函数指针,其中一个应为null。

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

答案 1 :(得分:0)

您可以将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);});

Live example