6
votes

appeler une fonction de modèle particulière basée sur une valeur énumérée

Considérez le code suivant où j'appelle une fonction de modèle spécifique CompuCost en fonction d'une valeur énumérée (catégorie). Dans les cas d'appel, les arguments de CompuCost sont identiques. Il existe une correspondance individuelle entre les valeurs ENUM et les types C ++. Comme les arguments sur ComputerCost sont toujours identiques sur tous les appels, est-il possible d'écrire le code suivant plus compactement, c'est-à-dire. sans répéter pour chaque valeur de type / énorme. xxx


1 commentaires

La catégorie connue est-elle connue au moment de la compilation?


5 Réponses :


1
votes

Étant donné que chacune des fonctions modèles est traitée par le compilateur sous forme de fonction différente, il n'y a aucun moyen d'éviter d'avoir un appel différent pour chacun. Vous pourriez être capable de simplifier en créant une table de pointes de fonction, car chaque fonction a la même signature.


0 commentaires

0
votes

C'est ce que sont les macros pour.

#define COMPUTECOST(X) computecost<X>(T, offT, Offset, CostMatrix)
case mxINT8_CLASS:   COMPUTECOST(signed char);   break;
case mxUINT8_CLASS:  COMPUTECOST(unsigned char);  break;
...etc...


0 commentaires

5
votes

Vous pouvez avoir une fonction qui prend catégorie et renvoie un pointeur de fonction approprié, qui est ensuite appelé avec les arguments appropriés: xxx

ou en utilisant un Carte , comme marque suggérée: xxx


1 commentaires

Eh bien, comme Mark dit, vous pourriez tout pousser sur une carte, je modifierai dans un exemple.



2
votes

Tout d'abord, tout ça sent un peu funky pour moi (les codes de type me font toujours peur un peu) ... On se sent comme ça devrait être une sorte de fonction virtuelle dans l'objet PRHS quoi que ce soit :.

alors votre code serait ressemblent à ceci xxx

si changement ComputerCost dans une fonction virtuelle membre n'est pas possible, alors vous serez coincé avec une construction de commutation laid quelque part dans Votre code ... Toutefois, si vous vous trouvez la même chose sur une fois et / ou vous trouverez qu'il clutter cette section du code, puis le handisez dans une fonction d'aide xxx < P> Ensuite, votre code ressemble simplement à ceci: xxx


0 commentaires

1
votes

Y a-t-il une raison pour laquelle vous n'utilisez pas une expédition dynamique pour la fonction CompuCost code> La chose la plus simple créerait une hiérarchie d'héritage et tout simplement en utilisant une expédition dynamique. Chaque type de la hiérarchie qui retournerait mxint8_class code> comme ID de classe implémenterait CompuCost code> comme appel à ComputerCost Code>, et de même pour tous Parmi les autres combinaisons. P>

S'il y a une raison forte de ne pas utiliser d'expédition dynamique, vous pouvez envisager de mettre en œuvre votre propre envoi dynamique de différentes manières. Le plus évident, simple et probablement plus facile à maintenir est ce que vous avez déjà. Un peu plus complexe peut être fait avec des macros, ou vous pouvez essayer une version ampliée juste pour le plaisir ... p>

La solution macro (la suivante en complexité) pourrait utiliser une macro pour définir la relation, une autre pour définir chaque case code> et ensuite les combiner: p> xxx pré>

combine: p> xxx pré>

J'ai vu cela Fait dans le passé, et n'aimez pas cela, mais s'il y a une bonne quantité d'endroits où vous devez cartographier la catégorie au type qui pourrait être simple à écrire de la solution difficile à maintenir. Notez également que la macro Forall_ids CODE> peut être utilisée pour implémenter des traits de métaprogrammation de la carte de l'ENum au type et inversement: P>

lookup[ mxGetClassID(prhs) ]( T, offT, Offset, CostMatrix );


2 commentaires

Juste une solution plus verbeuse au problème d'un runtime-int-de type.


@MAXIM YEGORUSKKIN: Oui, exactement.