我可以在c#中使用类似c++的委托中的方法指针吗

Can I use method pointers in c++ alike delegates in c#?

本文关键字:方法 c++ 指针 我可以      更新时间:2023-10-16

我想让class'(为了方便起见,我们称它为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::函数,或者使用指向静态方法的指针,该方法使用X*并调用我需要的特定方法,也不制作switch语句和标志,也不使用switch语句来代替该switch语句使用接口,实现策略patern并使用策略的静态实例作为参数;)这些并不是这种情况下的全部解决方法,但我仍然不想阅读其他解决方法。我唯一感兴趣的是"这是可能的,以及如何做到"。

@Robert是对的,在C++中使用委托的惯用方法是将std::functionstd::bind一起使用。

然而,如果您坚持使用指向方法的指针作为适当委托的变通方法,那么正确的语法是:

void X::ExtractedMethod( void(X::*MethodCallPointer)(TypeOfABCResult) ){
    (this->*MethodCallPointer)(someResultOfabc);
//  ^                        ^
//  note the parentheses, they are required

在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#中使用委托的工作方式非常相似。