在std :: function中存储带占位符的绑定结果

时间:2015-01-30 12:02:27

标签: c++ c++11 stdbind

我一直在阅读,如何在常规函数上执行std :: bind。 并将自由函数或成员函数存储到std :: function中。 但是,如果我尝试为一个参数使用占位符,而为另一个参数使用实际值;我无法对std :: function

进行调用(导致编译错误)

所以我尝试了以下代码:

#include <random>
#include <iostream>
#include <memory>
#include <functional> 

int g(int n1, int n2)
{
    return n1+n2;
}


int main()
{
    using namespace std::placeholders;  // for _1, _2, _3...

    std::function<int(int,int)> f3 = std::bind(&g, std::placeholders::_1, 4);
    std::cout << f3(1) << '\n';

//this works just fine
    auto f4 = std::bind(&g, std::placeholders::_1, 4);
    std::cout << f4(1) << '\n';
}

我收到以下错误g ++ 4.7

prog.cpp: In function 'int main()':
prog.cpp:17:22: error: no match for call to '(std::function<int(int, int)>)         (int)'
     std::cout << f3(1) << '\n';
                  ^
In file included from /usr/include/c++/4.9/memory:79:0,
                 from prog.cpp:3:
/usr/include/c++/4.9/functional:2142:11: note: candidate is:
     class function<_Res(_ArgTypes...)>
       ^
/usr/include/c++/4.9/functional:2434:5: note: _Res         std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res =         int; _ArgTypes = {int, int}]
     function<_Res(_ArgTypes...)>::
     ^
/usr/include/c++/4.9/functional:2434:5: note:   candidate expects 2 arguments, 1 provided

2 个答案:

答案 0 :(得分:4)

如果你将一个参数绑定到函数int g(int, int),剩下的可调用函数是一个函数,它将一个 int作为参数,而不是两个。

试试这个:

std::function<int(int)> f3 = std::bind(&g, std::placeholders::_1, 4);

答案 1 :(得分:1)

std::function的类型应为:

std::function<int(int)> f3 = std::bind(&g, std::placeholders::_1, 4);
                  ~~~
                  one argument

您的bind使用一个参数创建一个函数。这就是为什么你这样称呼f3:

std::cout << f3(1) << '\n';
  

注意:候选人需要2个参数,1个提供

应该是你的线索