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

Passing a function with arguments as an argument in C++ (Arduino)

本文关键字:参数 函数 C++ Arduino      更新时间:2023-10-16

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

看,我想要一个,比如说,run()函数,接受一个函数作为参数,这是容易的部分。 用法是这样的

void f() { }
void run(int (*func)) { 
//whatever code
func();
//whatever code
}
run(f);

这应该只运行f()功能,对吧?

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

但是我希望能够将任何函数传递给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++,所以它可能缺少一些东西,但我相信有一些库可以弥补这一点......

如果您有权访问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();
}