Considérez le code suivant où j'appelle une fonction de modèle spécifique CompuCost code> en fonction d'une valeur énumérée (catégorie). Dans les cas d'appel, les arguments de CompuCost code> sont identiques. Il existe une correspondance individuelle entre les valeurs ENUM et les types C ++. Comme les arguments sur ComputerCost CODE> 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.
5 Réponses :
É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. P>
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...
Vous pouvez avoir une fonction qui prend ou en utilisant un catégorie code> et renvoie un pointeur de fonction approprié, qui est ensuite appelé avec les arguments appropriés: Carte code>, comme marque suggérée: p>
Eh bien, comme Mark dit, vous pourriez tout pousser sur une carte, je modifierai dans un exemple.
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 p> si changement ComputerCost code> 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 p>
Y a-t-il une raison pour laquelle vous n'utilisez pas une expédition dynamique pour la fonction 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 combine: p> 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 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 ensuite les combiner: p> 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 );
Juste une solution plus verbeuse au problème d'un runtime-int-de type.
@MAXIM YEGORUSKKIN: Oui, exactement.
La catégorie connue est-elle connue au moment de la compilation?