如何解决在C ++中包装使用带void *参数的C函数
我在freeRTOS上包装了一个C函数,该函数创建一个任务,并在C ++中使用void指针获取其参数。该函数看起来像这样:
void createTask(TaskFunction_t taskCode,void * args);
据我的理解,要将2个参数传递给任务,我需要创建一个结构,将其地址转换为void *,将其传递,然后将其转换回原始状态,如下所示:
struct Params
{
const int a;
const double b;
};
static void task(void * args)
{
auto params = *static_cast<Params*>(args);
// do something with params.a and params.b
}
int main()
{
Params params{1,2.2};
createTask(task,static_cast<void*>(¶ms));
}
包装此函数的首选方法是什么,以便我可以传递可变数量的变量类型的参数?我应该只将void * args用作参数,还是可以通过模板或元组来做一些事情来简化此过程?
解决方法
从C ++ 11开始,您可以使用类似的
static void call_task(void *args) {
auto& f = *static_cast<std::function<void()>*>(args);
f();
}
// note: need this to stay alive!
std::function<void()> f = [&](){
// Any arguments you like here
do_whatever(1,2,3)
};
CreateTask(call_task,static_cast<void*>(&f));
您需要确保f
的生存期比任务的生存期长(就像对Params
对象的生存期一样。)
实际上,您可以完全避免使用std::function
,
template<typename Func>
void call_func(void *args) {
auto& f = *static_cast<Func*>(args);
f();
}
template<typename Func>
void wrapped_create_task(Func& func) {
CreateTask(call_func<Func>,static_cast<void*>(&func));
}
// you can still use `std::function` here,but you don't have to.
auto f = [&](){
// Any arguments you like here
do_whatever(1,3)
};
// this works on any object that implements `operator ()`
wrapped_create_task(f)
再次,f
在其执行期间保持生命是非常重要的。您不能将其放在任务执行之前就死亡的堆栈中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。