Überladene Funktionspointer?
-
Habe das hier gemacht - aber das geht nicht
#include <iostream.h>
#include <stdlib.h>int test1(int a);
int test2(double a, double b);int main()
{int (*ptr)(int a);
ptr=test1;
ptr(123);int (*ptr)(double b, double b);
ptr=test2;
ptr(3.1415,9.876);system("PAUSE");
return 0;
}int test1(int a)
{
cout<<a<<endl;
}int test2(double a, double b)
{
cout<<a<<endl;
cout<<b<<endl;
}
-
Original erstellt von <GOGO>:
**Habe das hier gemacht - aber das geht nicht
**Die Zeigervariablen haben ja auch denselben Namen und der zweite hat zweimal den Parameter b
-
Original erstellt von TriPhoenix:
... und der zweite hat zweimal den Parameter bDas macht nix, es handelt sich ja dabei nicht um eine Funktionsdefinition, d.h. double b wird ja nicht wirklich auf dem Stack angelegt.
Hier dein Programm richtig:
#include <iostream.h> #include <stdlib.h> int test1(int a); int test2(double a, double b); int main() { int (*ptr)(int a); ptr=test1; ptr(123); int (*ptr1)(double b, double b); ptr1=test2; ptr1(3.1415,9.876); return 0; } int test1(int a) { cout<<a<<endl; } int test2(double a, double b) { cout<<a<<endl; cout<<b<<endl; }
Um nochmal auf meine variable Liste von oben zu sprechen zu kommen, hier nun ein kleines C-Programm, welches dies realisiert:
#include <stdio.h> #include <stdarg.h> void test1(int a){ printf("--> In Funktion %s\n", __func__); printf(" a = %d\n", a); } void test2(double a, double b){ printf("--> In Funktion %s\n", __func__); printf(" a = %g\n", a); printf(" b = %g\n", b); } void test(char *func, ...){ int a1; double a, b; va_list zeiger; va_start(zeiger, *func); if(func=="test1"){ a1 = va_arg(zeiger, int); test1(a1); } else if(func=="test2"){ a = va_arg(zeiger, double); b = va_arg(zeiger, double); test2(a, b); } else printf("--> Falsche Funktion übergeben: %s\n", func); va_end(zeiger); } int main(void){ int a1=123; double a=123.4, b=234.0; printf( "Variable Funktion aufrufen\n" "--------------------------\n"); test("test1", a1); test("test2", a, b); test("test3", a1, b, a+b, b+a); return 0; }
Viel Spass damit...
Ciao!
-
if(func=="test1")
Es wundert mich wirklich, dass das funktioniert...Ein strcmp(func, "test1") == 0 wäre glaub ich angebrachter !
-
Original erstellt von <GOGO>:
**kann man den gleichen Funktionspointer zuerst auf test1 und später auf test2 setzen und dann die Funktion aufrufen?
**ja.
#include <iostream> using namespace std; int test1(int a) { return a*a; } int test2(int a,int b) { return a*b; } int main() { void (*f)()=reinterpret_cast<void(*)()>(&test1); cout<<(*reinterpret_cast<int(*)(int)>(f))(4)<<endl; f=reinterpret_cast<void(*)()>(&test2); cout<<(*reinterpret_cast<int(*)(int,int)>(f))(3,4)<<endl; return 0; }
-
Pfui
Sag wenigstens dazu das es undefiniert ist, oder ist es das nicht?
-
Was soll daran undefiniert sein?
@volkard: Arbeitest du öfters so, oder wolltest du nur auf die Frage antworten?
-
Jo das ist super - nur etwas lang... ich habe gehofft man kann dann einfach f() benutzen...
Gibts vielleicht eine Abkürzung für den Aufruf?
-
könntest um es zu kürzen die reinterpret_cast's durch C-Casts ersetzten, aber schön ist das nicht;)
-
Original erstellt von <GOGO>:
@volkard
Gibts vielleicht eine Abkürzung für den Aufruf?jo, gibts. aber ich wllte die fürchterlichkeit unterstreichen und werde weder typedefs, templates noch c_casts zur rein optischen verschönerung anbringen.
-
Original erstellt von Helium:
@volkard: Arbeitest du öfters so, oder wolltest du nur auf die Frage antworten?schlimm, daß du mir sowas zutraust.
-
Hm verdammt - ich suche eine bessere Lösung.
Wenn die redifinition etwas länger ist - dann ist es OK
aber ich hätte gerne den gleichen Aufruf wie bei normaler Funktionf=###setzte funktionspointer###
f(4);
f=###setzte funktionspointer###
f(3,4);das wäre ideal/genial...
-
ich glaub', daß du mehr sprachmittel brauchst. insbesondere template-klassen, die vin einer gemeinsamen basisklasse erben und so ein gerödel. und dann wirste schon was geeigneteres finden als ausgerechnet vollkommen unleserliche funktionspointer.