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

5
我希望创建一个类,其中包含成员函数,这些函数返回指向其他成员函数的指针。
也就是说,类似于以下内容:
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 ++中使用类似的模式。

2
std::functionstd::bind是你的好朋友。 - Captain Obvlious
1
你可以使用函数对象来实现这一点,但不能使用函数/成员函数。 - jrok
1
你想要的是一个依赖于自身的类型(递归类型?),显然是不允许的。 - Manu343726
2
这是关于GotW的内容:http://www.gotw.ca/gotw/057.htm - Sam Cristall
1
@SamCristall 把最后一节复制到这里,我们就有一个赢家了。 - Dialecticus
显示剩余3条评论
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),但我可能在这方面是错误的。对我来说,拥有一个返回自身的空闲状态更加直观。


是的,这就是大部分。虽然很酷,但它显示函数式编程在C++中并不是那么直观。关于返回0,这使您可以执行以下操作:for (FuncPtrRet state = test.s1(); state != 0; ) { state = (test.*state)(); } - Bertjan Broeksema
在C++中,函数式编程没有成员函数指针看起来更好。成员函数指针的语法非常糟糕。 - Sam Cristall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接