C++ 我可以在c+;中使用方法指针吗+;c#中的相似代表?

C++ 我可以在c+;中使用方法指针吗+;c#中的相似代表?,c++,class,pointers,methods,C++,Class,Pointers,Methods,我想让一个类(为了方便起见,我们称它为X)方法能够使用一个指向它自己方法的指针,在这种情况下,我能够提取只因调用的方法不同而不同的代码 例如,有几个块,如: a(); b(); c(); MehtodCall(someResultOfabc); d(); e(); 我想提取一个只使用作为指针传递的不同方法的方法: 所以我想要一些类似的东西: void X::ExtractedMethod( void(X::*MethodCallPointer)(TypeOfABCResult) ){

我想让一个类(为了方便起见,我们称它为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语句,实施策略模式,并使用策略的静态实例作为参数;)这些并不是本案的全部解决办法,但我仍然不想阅读其他解决办法。唯一使我感兴趣的是“这是可能的,如何做到”,在C++中,你可以使用Booost绑定绑定函数调用:

void X::DoSomethingA(){
    ExtractedMethod( boost::bind(&X::ADoer, pInstance) );
}
如果X::adore不是类X的静态成员,则需要pInstance

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

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

void X::ExtractedMethod( MyDelegateType delegate ) { ... }
typedef std::functionMyDelegateType;
void X::ExtractedMethod(MyDelegateType委托){…}

这不是一个解决办法。它是C++中的工作方式,它的工作原理与它在委托代理中的工作方式类似。

C++中,可以使用Booost绑定绑定函数调用:

void X::DoSomethingA(){
    ExtractedMethod( boost::bind(&X::ADoer, pInstance) );
}
如果X::adore不是类X的静态成员,则需要pInstance

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

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

void X::ExtractedMethod( MyDelegateType delegate ) { ... }
typedef std::functionMyDelegateType;
void X::ExtractedMethod(MyDelegateType委托){…}

这不是一个解决办法。它是C++中的如何使用,它的工作原理与它在委派中的工作原理类似。

@罗伯特是正确的,在C++中使用委托的惯用方式是使用<代码> STD::函数< /> >连同<>代码> STD::绑定< /COD> < < /P> 但是,如果您坚持使用指向方法的指针作为正确委托的变通方法,那么正确的语法是:

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

@罗伯特是正确的,在C++中使用委托的惯用方式是使用<代码> STD::函数< /> >同时<代码> STD::BIN < /C> > /P> 但是,如果您坚持使用指向方法的指针作为正确委托的变通方法,那么正确的语法是:

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

什么是“代码> X::Adoer-<代码> >代码> x::BDoer < /C>?它不被称为“方法”,它被称为C++中的“成员函数”。这个概念没有模糊性地映射到C++的成员函数,因此即使在C++中,这个术语也可以完全使用。SyAM,它不是一个正确的C++术语,讨论是关于C++的。C++是标准化的,标准的术语是成员函数,所以使用它。当讨论是一般性的时,可以使用一般性术语,但当讨论是特定的时,您应该始终使用特定术语。而且,因为它在C++上下文中没有被很好地定义,所以它变得模棱两可。我用了一个通用词,所以我的意思毫无疑问。关于将它们命名为“方法”或“成员函数”的争论在本主题中没有任何意义。如果你想就这个话题进行辩论,那么请提出你自己的“问题”,这样你就可以就不存在的问题进行辩论,而不是在这里发垃圾邮件。谢谢。代码<> x::Adoer-< /C> >和<代码>::BDoer < /C> >,它不被称为“方法”,它被称为C++中的“成员函数”。这个概念没有模糊性地映射到C++的成员函数,因此即使在C++中,这个术语也可以完全使用。SyAM,它不是一个正确的C++术语,讨论是关于C++的。C++是标准化的,标准的术语是成员函数,所以使用它。当讨论是一般性的时,可以使用一般性术语,但当讨论是特定的时,您应该始终使用特定术语。而且,因为它在C++上下文中没有被很好地定义,所以它变得模棱两可。我用了一个通用词,所以我的意思毫无疑问。关于将它们命名为“方法”或“成员函数”的争论在本主题中没有任何意义。如果你想就这个话题进行辩论,那么请提出你自己的“问题”,这样你就可以就不存在的问题进行辩论,而不是在这里发垃圾邮件。提前谢谢你。@syam:噢,我错过了那些括号。。现在我明白了为什么它没有编译。这正是我想要的:)在这种方法失败后,我确实使用了std::函数和lambda。我让自己这样做,因为“做所有事情”方法是私有的。但我必须说,我也喜欢boost::bind的这个解决方案,因为它看起来更优雅。@syam:噢,我错过了那些括号。。现在我明白了为什么它没有编译。这正是我想要的:)在这种方法失败后,我确实使用了std::函数和lambda。我让自己这样做,因为“做所有事情”方法是私有的。但我必须说,我也喜欢boost::bind的这个解决方案,因为它看起来更优雅。从这个问题来看,他似乎不想绑定实例。在这种情况下,他可能不知道他到底想要什么,或者可能不知道他的解决方案