我正在尝试创建一个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(),那么工作正常,这意味着函数已经与参数绑定,但是当它作为参数传递给另一个函数时它不起作用
答案 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
答案 2 :(得分:1)
未指定std::bind
的返回类型。因此,您不能指望std::bind
返回与std::function<void(int)>
相同类型的变量。使用decltype
和模板解析。
#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)