Je veux implémenter une sorte d'objets mathématiques "en nombre" (disons, des éléments dans un groupe ou un anneau) en C++. Je suis sûr que je ne suis pas le seul à gérer ce problème, donc il peut y avoir beaucoup de discussions sur la meilleure façon de surcharger les opérateurs arithmétiques. Cependant, je n'ai pas trouvé de réponses satisfaisantes (même si j'étais peut-être trop paresseux pour googler plus).Quel est le "meilleur" moyen de surcharger les opérateurs arithmétiques en C++ moderne?
Disons que je veux surcharger l'opérateur « + » pour une classe A. Le problème est, il y a trop de surcharges différentes que je peux penser:
- opérateur + (const A & x, const A & y)
- opérateur + (const A & x, A & & y)
- opérateur + (A & & x, const A & y)
- opérateur + (A & & x, A & & y)
- A :: opérateur + = (const A & y) &
- A :: opérateur + = (const A & y) & &
- A :: operator + = (A & & y) &
- A :: opérateur + = (A & & y) & &
Première question. Est-ce que toutes ces surcharges sont nécessaires pour rendre les opérations sur les instances de A aussi efficaces et aussi importantes que "d'être comme des types primitifs"? Je pense que pour les cas "ordinaires", rvalue-qualifié A :: operator + = ne doit pas (ou ne devrait pas) être surchargé. Est ce bien? Je pense que tous 1-4 sont nécessaires. Par exemple, pour le cas 3, puisque x est déplacé, nous n'avons pas besoin d'allouer un nouvel espace pour contenir la valeur de retour, et nous pouvons réutiliser en toute sécurité le stockage d'allocation réservé pour x. Est ce bien?
Deuxième question. Je pense que toutes ces surcharges peuvent partager beaucoup de codes pour la plupart de ce genre de cas. Comment puis-je minimiser la duplication de code sans sacrifier les performances/etc.? Existe-t-il des techniques/idiomes spéciaux pour le faire? Je préfère les méthodes générales et extensibles, si elles existent.
Merci, mais il est assez tard pour répondre :) Il semble que la méthode ci-dessus ne soit pas "la plus" efficace, car il peut y avoir des mouvements inutiles, mais semble tout à fait raisonnable. Puis-je trouver des références sur ce que je devrais faire lorsque des modèles d'expression sont impliqués? Je connais des articles écrits pour C++ 03, mais je n'en ai aucune idée avec C++ 11. Merci encore. –