#include <iostream>
using namespace std;
 
typedef int(*FuncType[8])(int);
bool a=false, b=false, c=false;
 
int A(int Current) {
   cout << "-----> FuncA" << endl;	 
   return 2;
}
 
int B(int Current) {
   cout << "-----> FuncB" << endl;	 
   c = true;  // тут типа управляем выходом из бесконечного цикла
   return 2;
}
 
int C(int Current) {
   cout << "-----> FuncC" << endl;	 
   return 6;
}
 
int D(int Current) {
   cout << "-----> FuncD" << endl;	 
   return 1;
}
 
int E(int Current) {
   cout << "-----> FuncE" << endl;	 
   return -1;
}
 
int JmpA(int Current) {
   cout << "JmpA" << endl;
   return (a) ? 0 : 6;
}
 
int JmpB(int Current) {
   cout << "JmpB" << endl;	 
   return (b) ? 1 : 7;
}
 
int JmpC(int Current) {
   cout << "JmpC" << endl;	 
   return (c) ? 4 : 3;
}
 
int main() {
	int StepNo = 5;
	FuncType Func = {A, B, C, D, E, JmpA, JmpB, JmpC};
	while((StepNo = (*Func[StepNo])(StepNo)) >= 0);
	return 0;
}