Hallo,
Können Datentypen in c++ anhand einer per Argumente
übergebener Liste mit Werte/Datentypen Paaren deklariert
werden?
Ja, mit templates:
template
void f(T x) {
T y; // eine Deklaration, deren Typ von der
// Argumentenliste abhängt.
}
Oder meinst du etwas anderes? Wenn ja, frage bitte ein
bisschen konkreter nach.
Ja, etwas anders:
argv[0] ist string mit funktionsname = „f“
argv[1] ist string Datentyp von Value von Parameter 1 = „DWORD“
argv[2] ist string Value von Parameter 1 der Funktion f = „NULL“
argv[3] ist string Datentyp von Value von Parameter 1 = „TCHAR“
argv[4] ist string Value von Parameter 1 der Funktion F = „A“
Jetzt Dein Vorschlag:
template
void f(T x) {
T y; // eine Deklaration, deren Typ von der
// Argumentenliste abhängt.
}
sagte ich doch schon, trotzdem muss der Datentyp von Parameter 1 der Funktion f zur Kompilierzeit bekannt sein:
switch (argv[1]) //geht in C++ nicht mit string, klar
{ //ab hier sind Deklarationen nur bis } gültig,
//wiederholte Deklarationen sind ungültig
case „DWORD“: DWORD param1 = (DWORD)argv[2];
break;
case „TCHAR“: TCHAR param1 = (TCHAR)argv[2];
break;
}
…
//Hier wird eine DLL dynamisch geladen
//Hier wird ein Handle zu eines DLL geholt
typedef int (__cdecl *PROC)(); //typedef Pointer zur DLL Funktion
PROC DllF;
__asm {
push param1 //Hier natürlich in abhängigkeit der Anzahl über-
call DllF //gebener Parameterpaare, aber erstmal eines…
…
}
Wie wird dieses Problem bei Variadics gelöst?
Welches Problem denn genau?
Das beschriebene
Tendenziell sind variadische Argumentenlisten in einer stark
typisierten Programmiersprache problematisch, ausser man legt
den Typ der variadisch deklarierten Argumente vorher fest.
Ich habe schon geglaubt, in c++99 (98) wären keine typedef templates möglich. Stimmt nicht. Das geht. Das Problem das ich habe ist, dass minimal 50 * 10^9 verschiedene Aufrufe möglich sind und ich soviele switches/ift/then/else Anweisungen keinem Anwender unterjubeln kann.
Templates, Variadics usw. können das ja nicht lösen, weil bei
beiden die Datentypen schon vor dem kompilieren festgelegt
werden müssen.
Die Typen von Templates müssen nicht zum Zeitpunkt des
kompilierens des Template-Codes bekannt sein, sondern erst zu
dem Zeitpunkt, an dem der Code kompiliert wird, der den
Template-Code benutzt.
Ich programiere hier ausführbaren Code, keine Bibliothek
Durch die übergebene Liste wären jedoch Reihenfolge, Datentyp
und Wert bekannt…
Ist eine andere Sprache die einzige Lösung?
Du scheinst mir ein XY-Problem zu haben:
http://www.perlmonks.org/index.pl?node_id=542341
Was willst du denn letztendlich erreichen?
Eine Wrapper DLL
Grüße,
Moritz