对象的方法作为 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)
.
我有一个 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)
.