【问题标题】:Pass function with or without argument as argument in C++在 C++ 中将带或不带参数的函数作为参数传递
【发布时间】:2015-03-02 11:46:03
【问题描述】:

我想将不带参数的 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) 成功传递 function2 的参数。

【问题讨论】:

  • 您说的是两种完全不同的函数类型。单个typedef 将无法同时容纳它们。您将不得不使用可变参数或模板来完成您的要求。

标签: c++


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢!这正是我想做的。不幸的是,我使用的环境不支持我所理解的 std:function :(
    • 如果你不能使用C++11,也许你可以使用Boost.Function那么呢?
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 2019-11-21
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多