0

我想让一个类'(为方便起见,我们称它为 X)方法能够使用指向其自己方法的指针,以防我能够提取仅因调用的方法而异的代码。

例如,有几个块,如:

a();
b();
c();
MehtodCall(someResultOfabc);
d();
e();

我想提取一个只使用作为指针传递的不同方法的方法:

所以我想要类似的东西:

void X::ExtractedMethod( void(X::*MethodCallPointer)(TypeOfABCResult) ){
    a();
    b();
    c();
    this->*MethodCallPointer(someResultOfabc);
    d();
    e();
}

并以这种方式使用这个功能:

void X::DoSomethingA(){
    ExtractedMethod(&X::ADoer);
}
void X::DoSomethingB(){
    ExtractedMethod(&X::BDoer);
}

和操作系统...

不幸的是,我被困在这里,因为我得到一个编译错误,即方法指针不会评估为采用一个参数的方法调用。

如果原因是 X 在此声明中仍然是不完整的类型,我开始徘徊?

如果有人能告诉我如何做到这一点,或者为什么不可能,我会很高兴。

我真正非常不想要的是获得一些变通方法,例如在签名和 lambda 中使用 std::function,或者使用指向采用 X* 并调用我需要的特定方法的静态方法的指针,也不做switch 语句和标志,也不是该 switch 语句使用接口,实现策略模式并使用策略的静态实例作为参数;)这些并不是这种情况下的所有解决方法,但我仍然不想阅读关于其他解决方法。我唯一感兴趣的就是以这种方式“有可能,以及如何去做”。

4

2 回答 2

3

@Robert 是对的,在 C++ 中使用委托的惯用方式是std::functionstd::bind.

但是,如果您坚持使用指向方法的指针作为适当委托的解决方法,那么正确的语法是:

void X::ExtractedMethod( void(X::*MethodCallPointer)(TypeOfABCResult) ){
    (this->*MethodCallPointer)(someResultOfabc);
//  ^                        ^
//  note the parentheses, they are required
于 2013-06-22T09:33:05.963 回答
2

在 C++ 中,您可以使用 boost bind 来绑定函数调用:

void X::DoSomethingA(){
    ExtractedMethod( boost::bind(&X::ADoer, pInstance) );
}

如果 X::ADoer 不是类 X 的静态成员,则需要 pInstance。

对于函数类型,您可以使用 std::function(最新的 C++)或 boost::function。

typedef std::function< void(TypeOfABCResult) > MyDelegateType;

void X::ExtractedMethod( MyDelegateType delegate ) { ... }

这不是一种解决方法。这就是你在 C++ 中的工作方式,它的工作方式与在 C# 中使用委托的工作方式非常相似。

于 2013-06-22T08:39:31.053 回答