【问题标题】:Passing a function with arguments as an argument in C++ (Arduino)在 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++,所以它可能缺少一些东西,但我相信有一些库可以弥补这一点......

【问题讨论】:

    标签: c++ pointers arduino arguments 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 “没有真正起作用”是什么意思?你能显示你的代码和任何错误信息吗?
    猜你喜欢
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2019-11-21
    • 2011-09-15
    相关资源
    最近更新 更多