Dodam tylko, że jeżeli chcesz mapować polecenia na funkcje już istniejące w programie podczas wykonania tegoż programu, bez predefiniowania wszystkich dostępnych funkcji już podczas kompilacji, to powinieneś skorzystać z biblioteki systemowej do obsługi kontenerów kodu lub do ładowania dynamicznego. Tzn. możesz użyć biblioteki libelf (zakładając, że korzystasz z linuxa), otworzyć samego siebie, przeiterować się przez wszystkie sekcje i tablice symboli wewnątrz tej sekcji i znaleźć odpowiednią funkcję. Łatwiejszym sposobem jest użycie dlopen aby dostać wskaźnik na dowolną funkcję w bibliotece współdzielonej albo programie aktualnie wykonywanym ( http://man7.org/linux/man-pages/man3/dlopen.3.html ). Pamiętaj jednak, że w przypadku c++ nazwy będą zamanglowane (extern "C" pomoże Ci uzyskać nazwy funkcji w stylu C).
Pozostaje problem przekazania parametrów do funkcji i przeżutowania wskaźnika na odpowiedni typ (zakładam, że własnego kodu asm do wołania funkcji nie zamierzasz pisać). Nie wiem na ile rozumiesz ABI i wygenerowany kod, ale upraszczając, funkcje napisane w C/C++ mają przypisane przejmowane i zwracane typy podczas kompilacji. Podczas uruchomienia programu, o ile to nie jest wersja debugowa, tej informacji już nie ma. Ewentualnym rozwiązaniem jest założenie, że wszystkie funkcje będą przyjmowały taki sam "opisowy" typ parametru, z którym bedą w stanie sobie poradzić. Takie dynamiczne typowanie dla ubogich ;).
Oczywiście można opisać wszystkie funkcje, zdefiniować sposoby ich wołania z poziomu parsera już podczas pisania programu. Ale w takim wypadku w ogóle nie potrzebujesz tego dynamicznego pobierania wskaźników na funckje. Zależy, czy chcesz mieć dynamiczne wołanie funkcji "natywnych" czy interpreter predefiniowanych poleceń.
P.S.
Inne pojęcie, które ewentualnie może Cię zainteresować to FFI ( https://en.wikipedia.org/wiki/Foreign_function_interface ).
void job( void(*fun)(), int typ_funkcji, void *data );