Ohne C++ und dem Rumgecaste an Klassen würde es in reinem C auf Rumgecaste an dem eigentlich auszuführenden Code sprich den Funktionen selbst herauslaufen, und das müsste deinen Anforderungen doch genügen?
z.B.
enum { PLUS,MINUS,MAL };
void plus(int i,int j) {printf("%d\n",i+j);}
void minus(int i,int j){printf("%d\n",i-j);}
void mal(int i,int j) {printf("%d\n",i*j);}
#define dispatch(x) ((x)==PLUS?plus:(x)==MINUS?minus:mal)
dispatch(PLUS)(2,5);
dispatch(MINUS)(1,99);
dispatch(MAL)(5,5);
Den Parameter an dispatch kannst du ja entsprechend deinen Bedingungen dynamisch gestalten.
Mit C++ geht es auch ohne Casts,falls dir Dispatching auf Methodenebene reicht; du hast dann alles in einer Klasse:
enum { PLUS,MINUS,MAL };
class D {
int x;
void plus(int a,int b){printf("%d",a+b);}
void minus(int a,int b){printf("%d",a-b);}
void mal(int a,int b){printf("%d",a*b);}
public:
D(int p){x=p;}
void doit(int a,int b){
switch(x) {
case PLUS: plus(a,b);break;
case MINUS: minus(a,b);break;
case MAL: mal(a,b);break;
}}};
D plus(PLUS),minus(MINUS),mal(MAL);
plus.doit(1,2);
minus.doit(3,4);
mal.doit(5,6);
Auch hier kannst du deine Bedingungen an den Konstruktor geben.