将参数传递给std :: function的函数向量的问题

时间:2015-08-31 07:04:48

标签: c++11 vector arguments std-function stdbind

我正在尝试创建一个std :: function的向量,然后将该向量传递给一个函数。我还需要将参数传递给函数对象,所以我使用的是std :: bind。这是代码:

#include <functional>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void execute(vector<function<void (int)>>& fs) {
    for (auto& f : fs) 
        f();
}

void func(int k) {
    cout << "In func " << k << endl;
}

int main()
{
    int i = 1;
    vector<function<void (int)>> x;
    auto f1 = bind(func, i);
    //f1(); // this does call intended function
    x.push_back(f1);

    execute(x);
}

但这会产生以下错误:

function_tmpl.cpp: In function ‘void execute(std::vector >&)’:
function_tmpl.cpp:14:5: error: no match for call to ‘(std::function) ()’
   f();
     ^
In file included from function_tmpl.cpp:1:0:
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/functional:2142:11: note: candidate is:
     class function
           ^
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/functional:2434:5: note: _Res std::function::operator()(_ArgTypes ...) const [with _Res = void; _ArgTypes = {int}]
     function::
     ^
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/functional:2434:5: note:   candidate expects 1 argument, 0 provided

如果我在main()中调用f(),那么工作正常,这意味着函数已经与参数绑定,但是当它作为参数传递给另一个函数时它不起作用

4 个答案:

答案 0 :(得分:2)

您正在使用带有单个int参数的void函数向量:vector<function<void (int)>>,但实际上是在推动void(void)函数。您需要做的就是将向量的元素类型更改为vector<function<void (void)>>。 Bind的工作大致如下:

下式给出:

void f1(int i) { printf("%d", i); }

bind(f1, 1)会返回一个新函数f2

void f2() 
{
    f1(1);
}

由于您正在推送f2,因此向量应存储void(void)个函数。

答案 1 :(得分:1)

绑定后,函数类型变为void()。因此,将vector的类型更改为vector<function<void ()>>,您就可以获得它。

#include <functional>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void execute(vector<function<void ()>>& fs) {
    for (auto& f : fs) 
        f();
}

void func(int k) {
    cout << "In func " << k << endl;
}

int main()
{
    int i = 1;
    vector<function<void ()>> x;
    auto f1 = bind(func, i);
    x.push_back(f1);

    execute(x);
}

结果:

In func 1

LIVE

答案 2 :(得分:1)

未指定std::bind的返回类型。因此,您不能指望std::bind返回与std::function<void(int)>相同类型的变量。使用decltype和模板解析。

Here is an example

#include <functional>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

template <typename T>
void execute(vector<T>& fs) {
    for (auto& f : fs) 
        f();
}

void func(int k) {
    cout << "In func " << k << endl;
}

int main()
{
    int i = 1;
    auto f1 = bind(func, i);
    vector<decltype(f1)> x; //deduce type of f1
    x.push_back(f1);
    execute(x);
}

答案 3 :(得分:0)

f是类型     函数&lt; void(int)&gt;&amp; 所以编译器希望你提供一个参数,如下所示:     F(1)