在 C++ (Arduino) 中将带有参数的函数作为参数传递
Posted
技术标签:
【中文标题】在 C++ (Arduino) 中将带有参数的函数作为参数传递【英文标题】:Passing a function with arguments as an argument in C++ (Arduino) 【发布时间】:2020-09-27 15:34:40 【问题描述】:我想为我的班级写一个包装函数...我真的不知道该怎么做!
看,我想要一个,比如说,run()
,函数,接受一个函数作为参数,这很容易。
用法类似于
void f()
void run(int (*func))
//whatever code
func();
//whatever code
run(f);
应该只运行f()
函数,对吧?
但是如果f()
有必需的参数呢?假设它被声明为f(int i, int j)
,我将继续重写run()
函数以分别接受那些int
s,并将它们传递给f()
函数。
但我希望能够将 Any 函数传递给 run()
,无论参数有多少,或者它们是什么类型。意思是,最后,我希望得到类似于我所期望的假设的用法
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++,所以它可能缺少一些东西,但我相信有一些库可以弥补这一点......
【问题讨论】:
【参考方案1】:如果您可以访问std::function
,那么您可以使用它:
void run(std::function<void()> fn)
// Use fn() to call the proxied function:
fn();
您可以使用 lambda 调用此函数:
run([]() f(1, 2); );
Lambda 甚至可以从其封闭范围中捕获值:
int a = 1;
int b = 2;
run([a, b]() f(a, b); );
如果您没有 std::function
但可以使用 lambda,则可以将 run
设为模板函数:
template <typename T>
void run(T const & fn)
fn();
【讨论】:
好的,我会检查它是否适用于我的主要项目并报告! 凯,我没有 std::function。模板解决方案似乎有效,但我也希望fn
的返回类型为非无效。一个结构,事实上。我知道这不是我在帖子中概述的内容,但我认为这很简单......我将如何做到这一点,以便我可以在 run()
函数中执行 returner=fn()
?
@TheFlazy 只需传入一个返回值的 lambda。在运行函数中,您将能够分配结果。 (我推荐auto result = fn();
,这样你就不必关心实际的返回类型。)
我该怎么做?使用您的语法,我传递了一个确实返回内容的函数,尝试为该返回分配一些内容,但它并没有真正起作用...@cdhowie
@TheFlazy “没有真正起作用”是什么意思?你能显示你的代码和任何错误信息吗?以上是关于在 C++ (Arduino) 中将带有参数的函数作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 C++ 中将二维数组/向量作为函数参数传递? [复制]