首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++ (Arduino)中传递一个带参数的函数作为参数

在C++ (Arduino)中传递一个带参数的函数作为参数
EN

Stack Overflow用户
提问于 2020-06-08 23:46:45
回答 1查看 209关注 0票数 0

我想为我的类写一个类似包装器的函数...我真的不知道该怎么做!

我想要一个,比方说,run()函数,接受一个函数作为参数,这是最简单的部分。其用法类似于

代码语言:javascript
运行
复制
void f() { }
void run(int (*func)) { 
//whatever code
func();
//whatever code
}
run(f);

这应该只运行f()函数,对吧?

但是如果f()有必要的参数呢?假设它被声明为f(int i, int j),我将继续重写run()函数,以单独接受这些int,并将它们传递给f()函数。

但是我希望能够将任何函数传递给run(),无论有多少参数,或者它们是什么类型。这意味着,最终,我希望得到类似于我所期望的假设的用法

代码语言:javascript
运行
复制
void f() {int i, int j}
void v() {char* a, int size, int position}
void run(int (*func)) { 
//whatever code
func();
//whatever code
}
run(f(1, 2));
run(v(array, 1, 2));

去做。我知道这看起来很愚蠢,但我想我已经明白我的意思了。

我该怎么做呢?

请记住,这是arduino-c++,所以它可能缺少一些东西,但我相信有一些库可以弥补这一点……

EN

回答 1

Stack Overflow用户

发布于 2020-06-08 23:51:46

如果你有权访问std::function,那么你可以直接使用它:

代码语言:javascript
运行
复制
void run(std::function<void()> fn) {
    // Use fn() to call the proxied function:
    fn();
}

您可以使用lambda调用此函数:

代码语言:javascript
运行
复制
run([]() { f(1, 2); });

Lambda甚至可以从它们的封闭作用域中捕获值:

代码语言:javascript
运行
复制
int a = 1;
int b = 2;
run([a, b]() { f(a, b); });

如果您没有std::function,但可以使用lambda,您可以将run作为模板函数:

代码语言:javascript
运行
复制
template <typename T>
void run(T const & fn) {
    fn();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62265975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档