E 'possibile in C++ creare una funzione che restituisca un funtore con la stessa firma della funzione?come creare una funzione che restituisce un funtore con la stessa firma della funzione?
in modo semplice, come legalizzare decltype(foo) foo();
.
o con functors: function<function<function<...(void)>(void)>(void)>
Mi piacerebbe usare questo per uno stato-macchina in cui ogni stato è una funzione che restituisce un funtore al successivo stato dell'oggetto. Ora ho implementato utilizzando le enumerazioni, ma mi sento come ci deve essere un modo migliore:
#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();
}
anche: c'è un modo meno goffo per formulare la domanda?
Perché stai scrivendo codice macchina di stato in C++ anziché VHDL? –
Perché sto parlando dell'astrazione matematica e non di una macchina reale. –
Beh, dipende da cosa intendi per "ritorno". I Funcitors si comportano come le funtions in un certo modo, quindi il compilatore valuterà comunque il valore del functor prima di restituire qualsiasi cosa in modo da finire con la ricorsione. –