【发布时间】:2013-06-23 11:53:27
【问题描述】:
是否有可能在 C++ 中创建返回具有与函数相同签名的函子的函数?
基本上,如何使decltype(foo) foo();合法化。
或使用仿函数:function<function<function<...(void)>(void)>(void)>
我想将它用于状态机,其中每个状态都是一个函数,它将函子返回到对象的下一个状态。我现在已经使用枚举实现了它,但我觉得一定有更好的方法:
#include <iostream>
using namespace std;
enum functionenum{END,FOO,BAR,BAZ};
functionenum foo(){
cout<<"FOO! > ";
string s;
cin>>s;
if(s=="end") return END;
if(s=="bar") return BAR;
return FOO;
}
functionenum bar(){
cout<<"BAR! > ";
string s;
cin>>s;
if(s=="end") return END;
if(s=="baz") return BAZ;
return BAR;
}
functionenum baz(){
cout<<"BAZ! > ";
string s;
cin>>s;
if(s=="end") return END;
if(s=="bar") return BAR;
if(s=="foo") return FOO;
return BAZ;
}
void state(){
auto f=foo;
while(true){
switch (f()){
case FOO: f=foo; break;
case BAR: f=bar; break;
case BAZ: f=baz; break;
case END: return;
};
};
}
int main(){
state();
}
还有:有没有更简洁的方式来表达这个问题?
【问题讨论】:
-
你为什么用 C++ 而不是 VHDL 编写状态机代码?
-
因为我说的是数学抽象,而不是实际的机器。
-
这取决于您所说的“返回”是什么意思。函子在某种程度上表现得像函子,所以编译器在返回任何东西之前仍然会评估函子的值,所以你最终会得到递归。
-
我的意思是只返回函子而不评估它。 (作为函数指针)
-
所以你试图从
state返回函数f?
标签: c++ recursion c++11 functor state-machine