Có thể trong C++ để tạo hàm trả về một hàm functor có cùng chữ ký với hàm không?cách tạo hàm trả về hàm functor có cùng chữ ký với hàm?
cơ bản, cách hợp pháp hóa decltype(foo) foo();
.
hoặc với functors: function<function<function<...(void)>(void)>(void)>
Tôi muốn sử dụng này cho một nhà máy mà mỗi tiểu bang là một hàm trả về một functor sang trạng thái tiếp theo của đối tượng. Bây giờ tôi đã thực hiện nó bằng cách sử enums, nhưng tôi cảm thấy như có phải là một cách tốt hơn:
#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();
}
thêm: là có một cách ít clunky với cụm từ các câu hỏi?
Tại sao bạn viết mã máy nhà nước bằng C++ thay vì VHDL? –
Bởi vì tôi đang nói về trừu tượng toán học chứ không phải về một cỗ máy thực tế. –
Vâng nó phụ thuộc vào những gì bạn có nghĩa là "trở lại". Functors hoạt động giống như các chức năng trong một cách, do đó trình biên dịch sẽ vẫn đánh giá giá trị của hàm functor trước khi trả về bất cứ điều gì, do đó bạn sẽ kết thúc với đệ quy. –