【发布时间】:2015-11-25 03:45:51
【问题描述】:
我正在尝试创建一个 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:在函数‘void execute(std::vector >&)’中: function_tmpl.cpp:14:5: 错误: 不匹配调用‘(std::function) ()’ F(); ^ 在 function_tmpl.cpp:1:0 包含的文件中: /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/functional:2142:11:注意:候选人是: 类函数 ^ /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/functional:2434:5: 注意:_Res std::function::operator()(_ArgTypes ...) const [with _Res =空白; _ArgTypes = {int}] 功能:: ^ /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/functional:2434:5:注意:候选人需要 1 个参数,提供 0如果我在 main() 中调用 f(),则可以正常工作,这意味着该函数已与参数绑定,但是当作为参数传递给另一个函数时它不起作用
【问题讨论】:
-
function<void (int)>只接受带有int的函数。调用f()缺少int。将其更改为function<void()>或使用f(0)。 -
@nwp,std::bind 不会将参数绑定到函数对象吗?
-
可以,但
function<void (int)>仍然需要int。将int绑定到函数后,绑定的函数不再需要int,因此它现在具有签名function<void()>。 -
@nwp那么在这种情况下如何传递参数?将其更改为function<void()>不允许传递有界函数,f(0)将无法达到目的? -
将
int绑定到函数时传递参数。如果您不知道绑定时函数应该具有的参数,则不应该绑定它,请返回function<void(int)>,并将参数的vector<int>传递给execute,然后执行fs[i](arguments[i])之类的操作。
标签: c++11 vector arguments std-function stdbind