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

C++ 如何将方法作为参数传递给其他方法?,c++,C++,我有两个方法类: 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(

我有两个方法类:

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;不起作用?我是否可以在不声明单独的函数匿名的情况下创建它?

您需要更改函数签名:

void myFunction2(void (ClassB::*run)(void), ClassB& b){}
然后用以下词语来称呼它:

A.myFunction2( &ClassB::run, B);
继续生活

附言

这些不是对象,而是功能:

ClassA A();
ClassB B();
您可以改为使用此选项:

ClassA A{};
ClassB B{};

您需要更改函数签名:

void myFunction2(void (ClassB::*run)(void), ClassB& b){}
然后用以下词语来称呼它:

A.myFunction2( &ClassB::run, B);
继续生活

附言

这些不是对象,而是功能:

ClassA A();
ClassB B();
您可以改为使用此选项:

ClassA A{};
ClassB B{};
myFunction接受指向独立函数的指针,而不是指向类方法的指针。非捕获lambda可隐式转换为函数指针

您需要:

添加采用方法指针的myFunction重载: myFunction接受指向独立函数的指针,而不是指向类方法的指针。非捕获lambda可隐式转换为函数指针

您需要:

添加采用方法指针的myFunction重载:
这是因为成员函数签名为void ClassB::*

但您希望作为参数void*

我建议您使用std::function解决以下问题:

#include <functional>
#include <iostream>

class ClassB
{
public:
    void print(std::string str) {
        std::cout << str << std::endl;
    }
};

void test_foo(std::function<void(std::string)> foo)
{
    foo("Hello");
}

int main (int argc, const char * argv[])
{
    //...

    ClassB b;
    auto print_f = std::bind(&ClassB::print, b, std::placeholders::_1);
    test_foo(print_f);

    return 0;
}

这是因为成员函数签名为void ClassB::*

但您希望作为参数void*

我建议您使用std::function解决以下问题:

#include <functional>
#include <iostream>

class ClassB
{
public:
    void print(std::string str) {
        std::cout << str << std::endl;
    }
};

void test_foo(std::function<void(std::string)> foo)
{
    foo("Hello");
}

int main (int argc, const char * argv[])
{
    //...

    ClassB b;
    auto print_f = std::bind(&ClassB::print, b, std::placeholders::_1);
    test_foo(print_f);

    return 0;
}

只需使用lambda版本。或者,您需要更改myFunction的签名。但为什么会发生这种情况?这是因为类的实例在内存中共享方法,而指向方法的指针不包含有关实例的信息吗?@filimonic这是因为函数指针和方法指针是两种完全不同且不兼容的类型。顺便说一句,这不是arduino特有的问题。只需使用lambda版本即可。或者,您需要更改myFunction的签名。但为什么会发生这种情况?这是因为类的实例之间在内存中共享方法,而指向方法的指针不包含有关实例的信息吗?@filimonic这是因为函数指针和方法指针是两种完全不同且不兼容的类型。顺便说一句,这不是arduino特有的问题。lambda通常比std::bind更可取,例如:ClassB;test_foo[&]std::string str{b.printstr;};lambda通常优于std::bind,例如:ClassB;test_foo[&]std::string str{b.printstr;};5.具有与此函数的接口,如parameter@Juraj你能详细说明一下吗?听起来你只是在重复OP的问题。对不起,我是说你的第二点。我首先评论为4。有一个与此函数作为参数的接口。后来我看到你添加了一点,但我没有注意到,所以我用5.5重新添加了评论。具有与此函数的接口,如parameter@Juraj你能详细说明一下吗?听起来你只是在重复OP的问题。对不起,我是说你的第二点。我首先评论为4。有一个与此函数作为参数的接口。后来我看到你添加了一点,但我没有注意到,所以我用5重新添加了评论。 #include <functional> class ClassA { public: void myFunction(std::function<void()> fn); }; class ClassB { public: void run(); }; void ClassA::myFunction(std::function<void()> fn) { fn(); } void ClassB::run() { ... } ClassA A; ClassB B; void runBfn() { B.run(); } void setup() { A.myFunction( runBFn ); A.myFunction( [](){ B.run(); } ); auto fn = std::bind(&ClassB::run, &B); A.myFunction( fn ); } class ClassA { public: template<typename Callable> void myFunction(Callable fn) { fn(); } }; class ClassB { public: void run(); }; void ClassB::run() { ... } ClassA A; ClassB B; void runBfn() { B.run(); } void setup() { A.myFunction( runBFn ); A.myFunction( [](){ B.run(); } ); auto fn = std::bind(&ClassB::run, &B); A.myFunction( fn ); }
#include <functional>
#include <iostream>

class ClassB
{
public:
    void print(std::string str) {
        std::cout << str << std::endl;
    }
};

void test_foo(std::function<void(std::string)> foo)
{
    foo("Hello");
}

int main (int argc, const char * argv[])
{
    //...

    ClassB b;
    auto print_f = std::bind(&ClassB::print, b, std::placeholders::_1);
    test_foo(print_f);

    return 0;
}