如何捕获函数参数并存储函数指针以供以后在 C++11 中执行?

How to capture function arguments and store function pointer for later execution in C++11?

本文关键字:函数 C++11 执行 参数 存储 指针 何捕获      更新时间:2023-10-16

我的要求是存储一些函数,以便以后使用预定义的参数执行。这是我尝试过的

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需要矢量元素的构造函数参数,并将直接就地构造std::function<void()>对象,而无需中间临时对象。


在此特定实例中,使用 lambda 时也不需要std::function,因为没有捕获的 lambda 会衰减到函数指针,您可以将其存储为std::function的轻量级替代方案:

std::vector<void(*)()> functionVector;

如果您打算存储带有捕获功能的 lambda,则需要std::function方法。