2011-01-10 4 views
0

J'ai quelque chose comme ci-dessous qui va se répéter plusieurs fois en fonction de la fonction qui s'appellegénération de code C++ pour tâche répétées très améliorée

pour par exemple

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

Comme accepte ci-dessus, il y a 20 autres fonctions (rejeter, annuler etc) qui fera le chose similaire.Mais les paramètres qu'ils insèrent peuvent différer en fonction de la fonction appelée.

Comment puis-je automatiser ce genre de code.So que je ne avez pas besoin d'écrire une nouvelle fonction de scratch.Basically ce que j'ai besoin si je fournir comme paramètres (« quantité », prodtype) par un certain fichier texte ou XML , il devrait générer la fonction requise avec les paramètres d'entrée .

Est-ce que cette tâche peut être gérée par C++ tempalte Meta Programming ou un autre outil de génération de code va m'aider à faire cela?

+1

que sont 'quantity' et' prodtype' dans les fonctions 'getfloat()' et 'getstring()'. sont-ils du même type? – Nawaz

+0

Trop vague ... Mais puisque vous utilisez Tools.h ++ ... Il y a probablement déjà une solution qui fait ce que vous voulez. Lire les docs plus difficile. :) – JimR

Répondre

1

Il est laid, mais vous pouvez utiliser une macro préprocesseur:

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

Et puis pour créer une fonction, vous devez juste faire:

FUNCTION_MACRO(accept_function, quantity, prodtype) 
+2

Que diriez-vous d'utiliser '# ATTRIB1' au lieu de' "ATTRIB1" 'dans' inserter'? De toute façon bonne tentative. +1 – Nawaz

+1

Macro sont les seules choses en c/C++ qui peuvent convertir un identifiant en chaîne .. donc c'est un bon moyen – vrdhn

+0

La macro ci-dessus ne sera utile que si toutes les fonctions ont un nombre fixe d'attributs.C'est pas le cas ici Basé sur le type de fonction, le nombre d'attributs diffère. Il peut être de 10, 20 ou 30 ans. Mis à part cela, tous ces nombreux paramètres sont encombrants. – sateesh

0

Eh bien, quand il revient le faire, vous pourriez presque certainement, mais cela nécessiterait la mise en œuvre d'un analyseur XML ou de texte dans TMP. Serait un exploit.

Ce n'est pas ainsi que les choses se passeraient normalement, mais vous n'avez pas spécifié assez de détails pour aller plus loin.

+0

Apolosize si la question est si confuse.Juste pour donner quelques informations sur la question, inserteur qui apparaissent dans le code n'est rien mais RWTValVector.sdd qui apparaissent dans mon code est hash map.Application récupère la valeur de la hashmap (sdd) en utilisant tag (chaînes) et l'insérer dans inserter qui est vecteur de roguewave.Plus tard ce vectro est utilisé pour insérer des données dans la table de base de données. Donc le code acutal apparaît comme inserter ["quantity"] << sdd.getfloat (fixtag :: quantity); Ici fixtag :: quantity est une chaîne comme suit fixtag :: quantity "2050". – sateesh

0

Les macros sont généralement à éviter, mais c'est un cas où elles sont toujours utiles. Quelque chose comme

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

vous permettra de dire

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

(La raison de la construction do-while étrange est de garantir que le résultat est une instruction unique.)

Définir différentes macros pour rejectfunction(), etc.

+0

+1 pour ce que l'on appelle la construction 'do-while'. chose similaire ici: http://stackoverflow.com/questions/4615171/are-there-problems-with-this-macro-check-status-and-return-if-failed – Nawaz

+0

Apolider si la question est si confuse.Juste gove un peu plus d'informations sur la question, inserter qui apparaissent dans le code est rien mais RWTValVector.sdd qui apparaissent dans mon code est hash map.Application récupère la valeur de la hashmap (sdd) en utilisant tag (chaînes) et l'insérer dans inserter qui est le vecteur de roguewave.Plus tard ce vectro est utilisé pour insérer des données dans la table de base de données. Donc le code acutal apparaît comme inserter ["quantity"] << sdd.getfloat (fixtag :: quantity); Ici fixtag :: quantity est une chaîne comme suit fixtag :: quantity "2050" – sateesh

+0

Donc tout ce qu'il fait ici est de lire les valeurs de hashmap et de les insérer dans un vecteur pour un traitement ultérieur. Pour l'application de fonction d'acceptation peut avoir besoin de 10 attributs, pour l'application de fonction de rejet peut nécessiter 20 attributs à remplir. C'est la raison pour laquelle j'ai demandé puis-je mettre des méta-données dans un fichier texte et l'utiliser comme entrée pour générer du code – sateesh