我的要求是存储一些函数,以便以后使用预定义的参数执行。这是我尝试过的
void doSomething(int i, int j) {
std::cout << "Sum " << i + j << std::endl;
}
int main(int argc, char *argv[]) {
std::vector<std::function<void(int, int)>> functionVector;
functionVector.push_back(std::bind(doSomething, 1, 2));
functionVector.push_back(std::bind(doSomething, 4, 2));
functionVector[0]();
functionVector[1]();
}
但是,这不能编译并给出以下错误
error: no matching function for call to object of type 'std::__1::__vector_base<std::__1::function<void (int, int)>,
std::__1::allocator<std::__1::function<void (int, int)> > >::value_type' (aka 'std::__1::function<void (int, int)>')
functionVector[0]();
^~~~~~~~~~~~~~~~~
我怎样才能做到这一点C++11/14
?
将参数绑定到函数后,调用不再使用任何其他参数。因此,函数类型应为void()
:
std::vector<std::function<void()>> functionVector;
另请注意,您可以在C ++ 11和更高版本中使用lambda,它们比std::bind
:
functionVector.push_back([](){ doSomething(1, 2); });
functionVector.push_back([](){ doSomething(4, 2); });
或略微简化,可以省略空的参数列表:
functionVector.push_back([]{ doSomething(1, 2); });
functionVector.push_back([]{ doSomething(4, 2); });
如您所见,lambda在这里没有任何参数,因此其调用运算符的类型为void()
。
尽管不会产生任何实际变化,但我也建议您使用emplace_back
(C ++ 11起)代替push_back
。
push_back
期望引用元素类型(在此处std::function<void()>
),但是由于您要传递其他内容,因此std::function<void()>
将首先将构造为push_back
参数的临时对象,然后将其从其构造为向量元素。
emplace_back
另一方面,期望vector元素的构造函数参数,并将std::function<void()>
直接就地构造对象,而无需中间临时对象。
在这种特定情况下std::function
,使用lambda时也不必要,因为没有捕获的lambda会衰减到函数指针,您可以将其存储为以下内容的轻量级替代std::function
:
std::vector<void(*)()> functionVector;
如果您打算存储带有捕获的lambda,则std::function
需要使用该方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句