如何捕获函数参数并存储函数指针以供以后在 C++11 中执行?
How to capture function arguments and store function pointer for later execution in C++11?
我的要求是存储一些函数以便稍后使用预定义参数执行。这是我试过的
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
方法。
我的要求是存储一些函数以便稍后使用预定义参数执行。这是我试过的
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
方法。