对象的方法作为 c++ 中另一个 class 的方法参数

Method of object as method argument of another class in c++

我有一个 class A 的实例,它有一些方法,例如:

class A
{
 ...
public:
 bool  DoOperation_one(Mytype*  pSomeValue);
 bool  DoOperation_two(Mytype*  pSomeValue);
 ... 
 bool  DoOperation_th(Mytype*  pSomeValue);
...
}

另一个class,class B,有一个指向A的指针class和一个方法BMethod。

Class B
{
 ...
 A*  myPtrA;
...

bool  BMethod(...);   // arguments have to be defined
}

是否可以将 A class 实例的方法作为参数传递给 BMethod?我将尝试通过以下伪代码更加清晰。在 class B 中的同一个地方,我使用 myPtrA 方法作为参数(带参数)调用 BMethod。我不想在调用时执行 myPtrA->DoOperation_two(somevalue),而只在 BMethod(if 语句)中执行:

    ...
    bool bVal = BMethod(myPtrA->DoOperation_two(somevalue))
    ...

bool B::BMethod("valid signature" myFunction)
{
 bool bfun=false;

  if (myFunction)
  {
    do_something....
  }

 return  bfun;
}

我的目标是仅在 BMethod 的主体中调用 BMethod 参数(DoOperation_one、DoOperation_two 或 DoOperation_th)。我一直在使用模板,但是 DoOperation_XXX 是在调用时执行的。

....
bool bVal = BMethod(myPtrA->DoOperation_two(somevalue));

or

bool bVal = BMethod(myPtrA->DoOperation_one(somevalue));

...

     template <typename FunctionT>
         bool BMethod(FunctionT myFunc)
    {
          bool bfun=false;
          bool breturn = false;
    
          while (!bfun)
          {
            if (myFunc)
             {
              bfun=true;
              breturn = some_other_operation();
             }
           }
    
         return  breturn ;
    }

此外,myFunc 包含 myPtrA->DoOperation_one(somevalue) 的结果,并且在 while 语句中不会更改,因为它已在调用时执行。

还有其他的approach/solution吗?

您可以传递一个成员函数指针,但是您需要一个 A 实例来调用它,并且需要一个 Mytype* 作为参数传递:

struct Mytype {};

struct A {
    bool  DoOperation_one(Mytype*  pSomeValue) { return true;}
    bool  DoOperation_two(Mytype*  pSomeValue) { return true;}
    bool  DoOperation_th(Mytype*  pSomeValue) { return true; }
};

struct B {
    A  a;
    template <typename F>
    bool  BMethod(F f,Mytype* mt) {
        bool bfun=false;
        bool breturn = false;
    
        while (!bfun) {
            if ((a.*f)(mt))
             {
              bfun=true;
              breturn = true;//some_other_operation();
             }
           }
    
         return  breturn ;
    }
};
int main() { 
    Mytype mt;
    B b;
    b.BMethod(&A::DoOperation_one,&mt);
}

与其将 BMethod 设为模板,我还可以明确地拼出类型,它是 bool (A::*)(Mytype*)。调用成员函数指针的语法有点笨拙。如果 a 是指向 A 的指针(就像在您的代码中一样),那么它是 (a.->f)(mt).

请注意,只有在执行 B::BMethod 时从 A::DoOperation_xyz 返回的值发生变化时,这才有意义。例如,当涉及多个线程时。如果是这种情况,您需要小心同步对共享数据的访问以避免数据竞争。如果这不是 multi-threaded,我看不出有什么理由让它变得复杂,BMethod 可以简单地是 bool BMethod(bool x).