Czy w języku C++ jest możliwe utworzenie funkcji zwracającej funktora z tym samym podpisem co funkcja?jak utworzyć funkcję, która zwraca funktor z tym samym podpisem co funkcja?
zasadniczo, jak zalegalizować decltype(foo) foo();
.
lub z funktorów: function<function<function<...(void)>(void)>(void)>
Chciałbym to wykorzystać do państwowego maszynie gdzie każdy stan jest funkcją, która zwraca funktor do następnego stanu obiektu. Mam teraz wprowadziły go przy użyciu stałe teksty, ale czuję, że musi być lepszy sposób:
#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();
}
także: czy istnieje sposób mniej przylegający do wyrażenia pytanie?
Dlaczego piszesz kod maszynowy w C++ zamiast VHDL? –
Ponieważ mówię o abstrakcji matematycznej, a nie o prawdziwej maszynie. –
To zależy od tego, co masz na myśli przez "powrót". Funktory zachowują się jak funty w pewien sposób, więc kompilator nadal oceni wartość funktora przed zwróceniem czegokolwiek, więc skończy się rekurencją. –