成员函数返回指向成员函数的指针

Member functions returning pointers to member functions

本文关键字:成员 函数 指针 返回      更新时间:2023-10-16

我想有一个带有成员函数的类,该类返回指向成员函数的指针。

也就是说,类似于:

class Foo {
// typedef ????(Foo::* func)????
public:
   Func s1();
   Func s2();
   Func s3();
}
Func Foo::s1() {
  // do stuff
  return &Foo::s2;
}
Func Foo::s2() {
  // do stuff
  return &Foo::s3;
}
Func Foo::s3() {
  // do stuff
  return 0;
}

基本上,我尝试做的是实现一个状态机,其中每个状态现在下一个状态并通过函数指针返回它。

注意:我对实现状态机的其他方法不感兴趣。我真的很想知道它是否可以以上述方式实现。

背景:我从这个演讲中得到了启发:http://www.youtube.com/watch?v=HxaD_trXwRE,想知道是否可以在C++中使用类似的模式。

公然在 GotW 上撕掉解决方案并将其适应成员函数:

class Foo {
  public:
    struct FuncPtrRet;
    typedef FuncPtrRet(Foo::*FuncPtr)();
    struct FuncPtrRet {
        FuncPtrRet(FuncPtr pp) : p(pp) { }
        operator FuncPtr() { return p; }
        FuncPtr p;
    };
    FuncPtrRet s1() { return &Foo::s2; }
    FuncPtrRet s2() { return &Foo::s3; }
    FuncPtrRet s3() { return &Foo::s3; }
};
int main() {
    Foo test;
    Foo::FuncPtr state = test.s1();
    state = (test.*state)();
    state = (test.*state)();
    state = (test.*state)();
    state = (test.*state)();
    state = (test.*state)();
    return 0;
}

这似乎适用于 Clang 3.3。 我不认为返回 0 是空闲状态的好选择(此处为 s3),但我可能错了。 对我来说,拥有返回自身的空闲状态似乎更直观。