在 C++ 中将多个 class 函数指针作为函数参数传递

pass multiple class function pointer as function parameter in c++

I am newly learning function pointer and able to pass function pointer between classes. Now i am looking to receive function pointer parameter of all the other classes.

fncptr2.h

 #ifndef FNCPTR2
 #define FNCPTR2

 class fncptr1;

 class fncptr2
 {
    public:
      int implfncptr(int (fncptr1::*add)(int,int));
 }; 

 #endif 

fncptr2.cpp

#include "fncptr2.h"
#include "fncptr1.h"
#include <iostream>

using namespace std;

fncptr1 ff;

int fncptr2::implfncptr(int (fncptr1::*add)(int, int))
{
   return (ff.*add)(1,2);
}

fncptr1.h

#ifndef FNCPTR1
#define FNCPTR1

class fncptr1
{
  public:
    int addition(int a,int b);
    void testfncptr();

};

#endif 

fncptr1.cpp

   #include "fncptr1.h"
#include "fncptr2.h"
#include <iostream>

using namespace std;

int fncptr1::addition(int a,int b)
{
    return a + b;
}

void fncptr1::testfncptr()
{
   fncptr2 f;
   f.implfncptr(&fncptr1::addition);
 }

main.cpp

fncptr1 f;
f.testfncptr();

The above sample code works fine. Now looking to receive all the function pointers in

int implfncptr(int (fncptr1::*add)(int,int));

Instead of receive fncptr1 function pointer , looking to receive the function pointers from all the other classes

Example

int implfncptr(int (AllClassInstance::*add)(int,int));

好的,你的问题不太合理,但听起来你想要的是一个更通用的解决方案。首先,我没有像您那样使用函数指针。这是非常 C 风格的,还有更好的方法。我对“更好”的定义是“适合更多解决方案”。我喜欢的方式可能会对性能造成非常轻微的影响。

 #include <functional>

 class Foo {
 public:
     typedef std::function<bool(std::string &)> MyFunct;

     void someMethod(MyFunct funct) {
         std::string str = "Foo";
         if (funct(str)) {
             ...
         }
     }
 };

 // Then somewhere else, you can do this:


 bool f(const std::string &str) {
     return str.length() > 10;
 }

 Foo foo;
 foo.someMethod(f);

但我喜欢这个的原因是你也可以使用 lambdas:

 Foo foo;
 foo.someMethod([](const std::string &str) { return str.length() > 10; });

或者您可以像这样预定义 lambda:

 Foo::MyFunct f = [](const std::string &str) { return str.length() > 10; };

 foo.someMethod(f);

我不知道这是否真的能帮助你推进你想做的事情,因为在我写这个答案时你的问题还不是很清楚。但这可能有助于提供一些其他方法来完成您想要的。

我确信有人支持 C 风格的函数指针,但在我看来,函数式接口提供了更好的特性。