在 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()函数以分别接受那些ints,并将它们传递给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++ 中将不同大小的常量数组作为函数参数传递

如何在 C++ 中将矩形发送到接受矩形参数的函数

我们如何在 C++ 中将二维数组/向量作为函数参数传递? [复制]

有没有办法在 C++ 中将 auto 作为参数传递?

带有 C++ Visual Studio Community 2013 的 Arduino 程序

在函数c ++中将变量作为默认参数传递[重复]