函数<void(t)>参数,默认参数为</void(t)>

时间:2014-05-18 09:17:14

标签: c++ c++11

我有一个参数类型为function<void(int)>的函数 我希望function<void(int)>有一个默认参数。

以下是示例代码:

class worker {
public:
    void do_the_job(function<void(int)> call_back = &worker::_log_call_back) {
        // doing the job ...
        call_back(1);
        // doing the job ...
        call_back(-1);
    }

    private:
        void _log_call_back(int status){
            cout << "status: " << status << endl;
        }
};

当我编译上面的代码时,我得到了一个错误的错误:

    worker().do_the_job(); // visual studio 2013 error
    //error C2664: 'void std::_Func_class<_Ret,int>::_Set(std::_Func_base<_Ret,int> *)' :
    //cannot convert argument 1 from '_Myimpl *' to 'std::_Func_base<_Ret,int> *'   c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional
为什么?以及如何解决它?

2 个答案:

答案 0 :(得分:4)

_log_call_backworker *作为隐藏参数,而function<void(int)>没有,因此它们不兼容。您可以使用static void _log_callback删除隐藏参数。 或者,您可以使用pointer to member function,例如void (worker::*p)(int) = worker::_log_call_back

答案 1 :(得分:4)

&worker::_log_call_back是获取成员函数指针的语法,但是成员函数指针不能直接调用,因为它不包含使用哪个实例获取它的信息(实际上,没有使用实例)获得它。)

不幸的是,即使你试图解决这个问题,默认参数也不能间接使用this。例如,

struct S {
  int m;
  void f(int = m) { }
};

也失败了。

除非你可以将_log_call_back变成不需要传递this的东西,例如静态成员函数,否则唯一的方法就是不使用默认参数。请改用过载:

void do_the_job(function<void(int)> call_back) {
  ...
}
void do_the_job() {
  do_the_job(std::bind(&worker::_log_call_back, this, std::placeholders::_1)));
}

或者,如果您愿意:

void do_the_job() {
  do_the_job([&](int status) { _log_call_back(status); });
}