2011-01-10 4 views
0

Ich habe so etwas wie unten, die viele Male wiederholt erhalten wird auf der Grundlage der Funktion dieC++ Code-Generierung für repeted Aufgabe

für zB

acceptfunction() 
    { 
     inserter["quantity"] = sdd.getfloat(quantity); 
     inserter["prodtype"] = sdd.getstring(prodtype); 
     : 
     : 
     so on 
    } 

Wie oben akzeptieren es 20 sind weitere Funktionen aufgerufen werden (ablehnen, abbrechen etc), die die ähnliche Sache tun wird. Aber die Parameter, die sie einfügen, können sich auf der Grundlage der aufgerufenen Funktion unterscheiden.

Wie kann ich diese Art von code.So automatisieren, die ich nicht brauchen neue Funktion von scratch.Basically zu schreiben, was ich brauche, ist, wenn ich Parameter wie schaffen („Menge“, prodtype) durch einige Textdatei oder XML , sollte es die erforderliche Funktion mit den Eingangsparametern erzeugen.

Kann diese Aufgabe durch C++ erledigt werden tempalte Meta-Programmierung oder andere Code Generation Tool wird mir helfen, dies zu tun?

+1

was sind 'quantity' und' prodtype' in den Funktionen 'getfloat()' und 'getstring()'. Sind sie vom selben Typ? – Nawaz

+0

Zu vage ... Aber da Sie Tools.h ++ verwenden ... Es ist wahrscheinlich eine Lösung bereits eingebaut, die das tut, was Sie wollen. Lesen Sie die Dokumente härter. :) – JimR

Antwort

1

Es ist hässlich, aber Sie können einen Präprozessormakro verwenden:

#define FUNCTION_MACRO(NAME, ATTRIB1, ATTRIB2)\ 
void NAME()\ 
{\ 
    inserter[#ATTRIB1] = sdd.getfloat(ATTRIB1);\ 
    inserter[#ATTRIB2] = sdd.getstring(ATTRIB2);\ 
} 

Und dann eine Funktion zu erstellen, die Sie gerade tun müssen:

FUNCTION_MACRO(accept_function, quantity, prodtype) 
+2

Wie wäre es mit '# ATTRIB1' anstelle von' "ATTRIB1" 'in' Inserter'? Jedenfalls guter Versuch. +1 – Nawaz

+1

Makro sind die einzigen Dinge in C/C++, die einen Bezeichner in String konvertieren können .. so ist dies ein guter Weg – vrdhn

+0

Das obige Makro wird nur hilfreich sein, wenn alle Funktionen eine feste Anzahl von Attributen hat. Dies ist hier nicht der Fall Je nach Art der Funktion unterscheidet sich die Anzahl der Attribute. Es kann 10 oder 20 oder 30 sein. Abgesehen davon ist das Überholen all dieser vielen Parameter mühsam. – sateesh

0

Nun, wenn es unten tun es kommt, Sie könnten fast sicher, aber es würde erfordern, einen XML- oder Textparser in TMP zu implementieren. Wäre eine ziemliche Leistung.

Das ist nicht, wie Dinge normalerweise getan würden, aber Sie haben nicht genügend Details angegeben, um weiter zu gehen.

+0

Apolosize, wenn die Frage so verwirrend ist.Nur mehr Informationen über die Frage goveve, Inserter, der im Code erscheint, ist nichts anderes als RWTValVector.sdd, die in meinem Code erscheinen, ist Hash-map.Application retrows den Wert von der hashmap (sdd) durch Verwendung von Tag (Strings) und Einfügen in den Inserter, der Vektor von Roguewave ist. Später wird dieses Vectro verwendet, um Daten in die Datenbanktabelle einzufügen. So erscheint der acutal Code als Inserter ["Quantity"] << sdd.getfloat (fixtag :: quantity); Hier ist fixtag :: menge eine Zeichenkette asbelow fixtag :: menge "2050". – sateesh

0

Makros sind im Allgemeinen zu vermeiden, aber dies ist ein Fall, in dem sie noch nützlich sind. So etwas wie

#define GET_FUNCTION(type, name)     \ 
    do            \ 
    {            \ 
     inserter[#name] = sdd.get ## type(name); \ 
    }            \ 
    while (0) 

lassen Sie sagen

void acceptfunction() 
{ 
    GET_FUNCTION(float, quantity); 
    GET_FUNCTION(string, prodtype); 
    // etc... 
} 

(Der Grund für das ungeradee do-while-Konstrukt zu gewährleisten ist, dass das Ergebnis eine einzige Aussage.)

definiert verschiedene Makros für rejectfunction() usw.

+0

+1 für das so genannte Do-While-Konstrukt. ähnliche Sache hier: http://stackoverflow.com/questions/4615171/are-there-problems-with-this-macro-check-status-and-return-if-failed – Nawaz

+0

Apolosize, wenn die Frage so verwirrend ist.Nur zu gove einige weitere Informationen über die Frage, Inserter, die im Code erscheinen, ist nichts anderes als RWTValVector.sdd, die in meinem Code erscheint Hash-Map.Application retrows den Wert von der Hash-Map (sdd) durch Verwendung von Tag (Strings) und fügen Sie es in Inserter Das ist Vektor von Roguewave.Later dieses Vectro wird verwendet, um Daten in Datenbanktabelle einzufügen. So erscheint der acutal Code als Inserter ["Quantity"] << sdd.getfloat (fixtag :: quantity); Hier ist fixtag :: menge eine Zeichenkette asbelow fixtag :: menge "2050" – sateesh

+0

Also alles, was es hier tut, liest Werte aus hashmap und fügt sie zur späteren Verarbeitung in den Vektor ein. Für die Annahme-Funktion-Anwendung müssen möglicherweise 10 Attribute, für die Ablehnung Funktion müssen möglicherweise 20 Attribute zu füllen. Das ist der Grund, warum ich fragte, ob ich einige Metadaten in eine Textdatei schreiben und sie als Eingabe für die Generierung von Code verwenden kann – sateesh