C++ 如何键入指向返回该方法指针的方法的指针?

C++ 如何键入指向返回该方法指针的方法的指针?,c++,member-function-pointers,C++,Member Function Pointers,基本上我有以下课程: class StateMachine { ... StateMethod stateA(); StateMethod stateB(); ... }; 方法stateA()和stateB()应该能够返回指向stateA()和stateB()的指针。 如何键入StateMethod?我的原则是不要使用原始成员函数指针。我甚至不知道如何使用原始指针typedef做你想做的事情,因为语法太可怕了。我喜欢使用boost::function 这几乎肯定是错误的: class X {

基本上我有以下课程:

class StateMachine {
...
StateMethod stateA();
StateMethod stateB();
...
};
方法stateA()和stateB()应该能够返回指向stateA()和stateB()的指针。
如何键入StateMethod?

我的原则是不要使用原始成员函数指针。我甚至不知道如何使用原始指针typedef做你想做的事情,因为语法太可怕了。我喜欢使用boost::function

这几乎肯定是错误的:

class X
{
  public:
    typedef const boost::function0<Method> Method;

    // some kind of mutually recursive state machine
    Method stateA()
    { return boost::bind(&X::stateB, this); }
    Method stateB()
    { return boost::bind(&X::stateA, this); }
};
X类
{
公众:
typedef const boost::function0方法;
//某种相互递归的状态机
方法stateA()
{return boost::bind(&X::stateB,this);}
方法stateB()
{return boost::bind(&X::stateA,this);}
};

这个问题肯定比第一眼看到的要困难得多。编辑:njsf证明我错了。但是,您可能会发现静态强制转换更易于维护,因此我将把其余部分留在这里

没有“正确”的静态类型,因为完整类型是递归的:

typedef StateMethod (StateMachine::*StateMethod)();
最好使用
typedef void(StateMachine::*StateMethod)()state=(StateMethod)(this->*state)()

PS:
boost::function
需要显式返回类型,至少从我的阅读来看:
boost::function0

表示为此目的使用带有隐式转换的代理类

struct StateMethod;
typedef StateMethod (StateMachine:: *FuncPtr)(); 
struct StateMethod
{
  StateMethod( FuncPtr pp ) : p( pp ) { }
  operator FuncPtr() { return p; }
  FuncPtr p;
};

class StateMachine {
  StateMethod stateA();
  StateMethod stateB();
};

int main()
{
  StateMachine *fsm = new StateMachine();
  FuncPtr a = fsm->stateA();  // natural usage syntax
  return 0;
}    

StateMethod StateMachine::stateA
{
  return stateA; // natural return syntax
}

StateMethod StateMachine::stateB
{
  return stateB;
}
这个解决方案有三个主要方面 优势:

  • 它根据需要解决问题。更好的是,它的类型安全和 便携式

  • 它的机制是透明的:您可以为 调用方/用户和的自然语法 函数自身的“返回状态a 声明

  • 它可能没有开销:在现代编译器上,代理类, 由于其存储和功能,应 内联并优化到零

  • 仅使用typedef:

    class StateMachine {  
    
     public:  
    
      class StateMethod;     
      typedef StateMethod (StateMachine::*statemethod)();   
    
      class StateMethod {  
    
        statemethod   method; 
        StateMachine& obj; 
    
       public:  
    
        StateMethod(statemethod method_, StateMachine *obj_)  
          : method(method_), obj(*obj_) {} 
    
        StateMethod operator()() { return (obj.*(method))(); }  
      };  
    
      StateMethod stateA()  { return StateMethod(&StateMachine::stateA, this); }  
    
      StateMethod stateB()  { return StateMethod(&StateMachine::stateB, this); }  
    
    };    
    

    我永远记不住可怕的C++函数DESECSPEC,所以每当我必须找出描述成员函数的语法时,例如,我只会引发一个故意的编译器错误,通常会为我显示正确的语法。 因此:

    class StateMachine { 
        bool stateA(int someArg); 
    };
    
    stateA的typedef的语法是什么?不知道。。让我们试着给它分配一些不相关的东西,看看编译器是怎么说的:

    char c = StateMachine::stateA
    
    编译器说:

    error: a value of type "bool (StateMachine::*)(int)" cannot be used to initialize 
           an entity of type "char" 
    

    这就是:“bool(StateMachine::*)(int)”是我们的typedef。

    Heh,我看到了你先前的答案。这可能是最好的折衷方案;我在IRC上讨论过这一点,并得出结论,typedef引用自身可能是一个“太难”的问题。不过,在内部boost::function0中,您不需要提供一个返回类型,并再次递归吗?可能是,我不是坐在编译器前这听起来像是用模板元编程编写的Y组合器的完美工作language@1800信息:是的,我的第一个想法是“好吧,我会在typedefs上写一个Y组合符……哦,天哪。”哇,在我看来,这个问题比看起来要困难得多。如果你愿意破坏完全类型的安全,有各种各样的方法来解决它,但除此之外……哇,是的,这是一个“破坏类型的安全”正如我在问题注释中提到的方法。这太糟糕了,真的。我真的希望有一种方法可以干净地解决这个问题。也许C++0x会提供一种方法?不,对于一个热切求值的类型系统,这实际上是不可能的-不仅仅是C++。你需要一个懒散求值的类型系统。不能将成员函数指针强制转换为常规函数指针,但我还是要指出,你仍然只是在渲染Cask:),我已经5年没有做任何C++开发了,并且很高兴忘记了成员函数指针。是的,我同意在你的回答中这只是演员的糖分:)如果你改变typedef,应该没问题吧?typedef StateMethod(StateMachine::*FuncPtr)();啊,这就是我想要的语法。非常感谢。