gpt4 book ai didi

c++ - 如何将方法作为参数传递给其他方法?

转载 作者:行者123 更新时间:2023-12-01 15:12:37 26 4
gpt4 key购买 nike

我有两个带有方法的类:

void ClassA::myFunction(void (*fn)() = NULL);
void ClassB::run();
还有一些代码
ClassA A();
ClassB B();

void runBfn()
{
B.run();
}

void setup()
{
A.myFunction( runBFn ); // works
A.myFunction( [](void){B.run();} ); // works
A.myFunction( B.run ); // not works
}
为什么 A.myFunction( B.run );不工作?我可以在不声明单独的函数(匿名与否)的情况下实现它吗?

最佳答案

myFunction()接受一个指向独立函数的指针,而不是指向类方法的指针。非捕获 lambda 可隐式转换为函数指针。
您需要:

  • 添加 myFunction() 的重载采用方法指针:

  • B类;

    类A类{
    上市:
    void myFunction(void (*fn)());
    void myFunction(B &b, void (B::*fn)());
    };

    类B类{
    上市:
    无效运行();
    };

    void ClassA::myFunction(void (*fn)()) {
    fn();
    }

    void ClassA::myFunction(B &b, void (B::*fn)()) {
    (b.*fn)();
    }

    无效 ClassB::run() {
    ...
    }

    A类;
    B类B;

    无效 runBfn() { B.run(); }

    无效设置(){
    A.myFunction(runBFn);
    A.myFunction( [](){ B.run(); } );
    A.myFunction(B, &ClassB::run);
    }
  • 添加 myFunction() 的重载它采用 ClassB 的接口(interface)实现:

  • 类可运行{
    上市:
    虚空运行()= 0;
    };

    类A类{
    上市:
    void myFunction(void (*fn)());
    void myFunction(Runnable &r);
    };

    类ClassB:公共(public)可运行{
    上市:
    无效运行()覆盖;
    };

    void ClassA::myFunction(void (*fn)()) {
    fn();
    }

    void ClassA::myFunction(Runnable &r) {
    r.run();
    }

    无效 ClassB::run() {
    ...
    }

    A类;
    B类B;

    无效 runBfn() { B.run(); }

    无效设置(){
    A.myFunction(runBFn);
    A.myFunction( [](){ B.run(); } );
    A.myFunction(B);
    }
  • 制作 myFunction()拍下std::function而不是函数指针:

  • #include <功能>

    类A类{
    上市:
    void myFunction(std::function fn);
    };

    类B类{
    上市:
    无效运行();
    };

    void ClassA::myFunction(std::function fn) {
    fn();
    }

    无效 ClassB::run() {
    ...
    }

    A类;
    B类B;

    无效 runBfn() { B.run(); }

    无效设置(){
    A.myFunction(runBFn);
    A.myFunction( [](){ B.run(); } );
    auto fn = std::bind(&ClassB::run, &B);
    A.myFunction(fn);
    }
  • 制作 myFunction()可以使用任何兼容的可调用函数/对象调用的模板函数:

  • 类A类{
    上市:
    模板<类型名可调用>
    无效 myFunction(可调用 fn){
    fn();
    }
    };

    类B类{
    上市:
    无效运行();
    };

    无效 ClassB::run() {
    ...
    }

    A类;
    B类B;

    无效 runBfn() { B.run(); }

    无效设置(){
    A.myFunction(runBFn);
    A.myFunction( [](){ B.run(); } );
    auto fn = std::bind(&ClassB::run, &B);
    A.myFunction(fn);
    }

    关于c++ - 如何将方法作为参数传递给其他方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62727865/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com