我正在编写一个异步函数,它接受一个回调fn,在完成后调用。一般来说,这工作正常(但有一些限制),我能够发送如下的参数。
#include <boost/bind.hpp>
#include <iostream>
void foo_cb(int result, const char* data) {
std::cout << "foo_cb executed with params " << result << ", " << data << std::endl;
}
//void foo_caller(std::function<void(int, const char*)> ff) {
//template <typename... Args>
void foo_caller(std::function<void(int, const char*)> ff) {
std::cout << "Caller executing..." << std::endl;
ff(1, "hi");
}
int main(int argc, char** argv) {
int x = 122;
const char* y = "Hello nether world";
foo_caller(boost::bind(foo_cb, x, y));
return 0;
}
我有两个问题:
在foo_caller()函数内部,在调用回调ff时,我必须给出一些虚拟值来满足被调用fn的函数签名,即ff(1,“hi”);但这会正确执行并打印main()中传递的原始值。不得不使用一些值调用ff()看起来非常不自然。
在我的main()中,我可能决定将不同类型和/或数量的参数传递给回调函数,并相应地编写完成处理程序。在这种情况下,我如何实际编写异步函数foo_caller(...)来获取可变数量的args和数据类型并正确调用完成处理程序?
更新
感谢Jonesinator,在看了std :: placeholders之后,我意识到我在做什么错误。
有效代码的更新版本如下:
void foo_cb(int result, const char* data) {
std::cout << "foo_cb executed with params " << result << ", " << data << std::endl;
}
void foo_caller(std::function<void(int, const char*)> ff, int a, const char* b) {
std::cout << "Caller executing..." << std::endl;
ff(a, b);
}
int main(int argc, char** argv) {
int x = 122;
const char* y = "Hello nether world";
foo_caller(std::bind(foo_cb, std::placeholders::_1, std::placeholders::_2), x, y);
return 0;
}
答案 0 :(得分:3)
由于您使用的是std::function
,因此您可能也应该使用std::bind
。对于在std::bind
创建时未绑定的参数,std::function
函数可以使用placeholder arguments。
答案 1 :(得分:0)
对于您的第一个问题:由于您将参数绑定到函数,foo_caller
的签名应该是:
void foo_caller(std::function<void()> ff)
boost :: bind复制你传递的参数并创建一个新的可调用实体,该实体可以不带参数调用(因为它们被这个新实体所知)并返回void。
如果你想稍后传递参数,你必须像Jonesinator在答案中解释的那样绑定占位符。