4

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

也就是说,类似:

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++ 中使用类似的模式。

4

1 回答 1

4

在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)是一个好的选择,但我可能错了。拥有一个返回自身的空闲状态对我来说似乎更直观。

于 2013-10-25T22:58:45.250 回答