Typ der Variable ermitteln, auf die ein void* zeigt

Alien

Mitglied
Hallo zusammen!

Ich brauch mal wieder Hilfe:
Ich möchte über einen void* als Funktionsparameter entweder einen Vector<string>, eine Map<string, sting> oder aber einen string übergeben.

Wie kann ich nun innerhalb der Funktion den Typ der referenzierten Variable bestimmen?
 
Hallo zusammen!

Ich brauch mal wieder Hilfe:
Ich möchte über einen void* als Funktionsparameter entweder einen Vector<string>, eine Map<string, sting> oder aber einen string übergeben.

Wie kann ich nun innerhalb der Funktion den Typ der referenzierten Variable bestimmen?
Kannst du nicht. Du mußt die Information welcher Typ es ist mit übergeben (z.B. als enum Wert).

Warum willst du denn keine Funktions-Überladung verwenden?

Gruß
 
weil das ne fette, komplexe Funktion wird. Und ich will das ungerne mit Unterfunktionen verschachteln... Ansonsten kenne ich keine Möglichkeit, Teile der Funktion "auszulagern" um sie von beiden Überladungen verwenden zu lassen. Oder hab ich da was falsch verstanden?

EDIT: Hab' vergessen, Danke zu sagen ;-)

Danke!
 
Zuletzt bearbeitet:
Ich kenne das Problem ja nicht so gut. Man könnte aber 2 Pointer übergeben:
Code:
Vector<string>*
Map<string, sting>*
Wobei, der Typ, welcher nicht benötigt wird, nur eine 0 ÜBergibt, daran kann man dann auch schnell erkennen, welcher dieser Beiden Typen benutzet werden sollte.

Da fällt mir noch was ein. Hier könnte man vermutlich wunderbar ein template benutzen.

mfg
SGSSGene
 
weil das ne fette, komplexe Funktion wird.
Das riecht aber nach Unübersichtlichkeit und schlechter Wartbarkeit... Eigentlich sollte man ja immer versuchen fette Funktionen zu vermeiden.
Und ich will das ungerne mit Unterfunktionen verschachteln...
Warum? Divide et impera.
Ansonsten kenne ich keine Möglichkeit, Teile der Funktion "auszulagern" um sie von beiden Überladungen verwenden zu lassen.
Es gibt eine Möglichkeit: Objekte und Vererbung. Siehe Schablonen-Designmuster.

Gruß
 
Das Dumme: ich darf nur den einen Parameter verwenden.

Hintergrund: Das soll eine Lib werden, die ein altes Perl-Modul ersetzen soll - und das möglichst ohne Änderung an bestehenden Programmen. Nun sieht der Aufruf in Perl so aus:

Code:
sub get_value(\@ \% $)

der erste Parameter ist eine Referenz auf ein indiziertes Array (List), das zweite eine optionale Referenz auf einen Hash (default: undefined) und der dritte Parameter ein String (by value).
Zu dem Problem, dass die Funktion kompatiblel zu der Perl-Version sein muss kommt nun noch die des optionalen Parameters in der Mitte ^^
 
Das riecht aber nach Unübersichtlichkeit und schlechter Wartbarkeit... Eigentlich sollte man ja immer versuchen fette Funktionen zu vermeiden.
Nicht meine Entscheidung. Siehe meinen letzten Post...

Warum? Divide et impera.
Bleibt mir wohl ohnehin nichts anderes über...

Es gibt eine Möglichkeit: Objekte und Vererbung. Siehe Schablonen-Designmuster.
Das ist bereits eine Klassenmethode.



EDIT:
Ich seh' schon - ich muss das Design des ganzen wohl nochmal gründlich überdenken. Danke jedenfalls für eure Hilfe!
 
Zuletzt bearbeitet:
Wieso überlädst du die Funktion nicht einfach? Dann hast du eben eine Funktion, die Vector<string>* und eine, die Map<string,string>* annimmt. Was ist das Problem? Wenn die gleich heißen, dann sollte das doch gehen!?
 
alternativ könntest du auch mit dem dynamic_cast arbeiten. wenn du ja weisst, welche objekte ankommen können, könntest du mit dem dynamic_cast operator darauf prüfen. ist zwar auch nicht die edelste variante, aber wenn du ja nicht überladen möchtest könntest dus so machen.
 
Hi.
alternativ könntest du auch mit dem dynamic_cast arbeiten. wenn du ja weisst, welche objekte ankommen können, könntest du mit dem dynamic_cast operator darauf prüfen. ist zwar auch nicht die edelste variante, aber wenn du ja nicht überladen möchtest könntest dus so machen.
Man kann keinen Zeiger auf void* in einem dynamic_cast verwenden. Den dynamic_cast kann man nur für die Navigation in Klassenhierarchien verwenden, dazu müssen die Klassen allerdings polymorph sein (was auf keine Kontainer-Klasse der STL zutrifft).

Gruß
 
Zurück