Templates et surcharges.. [C++] - C++ - Programmation
Marsh Posté le 28-01-2013 à 08:19:32
l'explicit template specialization peut il se faire dans ce cas ?
Marsh Posté le 28-01-2013 à 11:05:23
Et dans ce cas pourquoi ne pas surcharger plutôt les opérateurs +, -, /, *,
Avec qq chose du type
Code :
|
ça doit marcher non ?
Cdlt,
dreameddeath
Marsh Posté le 28-01-2013 à 11:44:02
Non operator+ ne prend qu'un seul argument !
Il faut spécialiser la classe elle même, sans retaper tout, c'est ça le hic
Marsh Posté le 28-01-2013 à 13:21:30
L'opérateur + prend un paramètre si il est défini dans la classe (qui ne permet que de faire "objet + paramètre" ), mais deux si il est défini en dehors (ce qui est impératif pour déclarer "parametre + objet" ).
C'est le cas pour tous les opérateurs de ce type, ainsi que les comparaisons. Seul l'opérateur = doit être déclaré dans la classe.
Marsh Posté le 27-01-2013 à 23:54:13
Bonjour,
Voila, j'utilise une classe Matrix pour faire du calcul matriciel. C'est une classe templatisé, de sorte que le type des valeurs mais aussi les dimensions de la matrice sont fixés à la compilation. Comme ceci:
C'est extrêmement utile pour s'assurer lors de la compilation que les dimensions de deux matrices sont compatibles lors d'une multiplication (bien entendu, via des opérateurs surchargés, comme ceci :
Jusque la tout va bien. La on ça se corse c'est que je veux aussi pouvoir écrire:
Lorsque x et c sont des scalaires, et lorsque (et uniquement lorsque) M est une matrice ligne, A est une matrice colonne, et donc M*A est un scalaire.
Avec le operator* décrit au dessus, le compilateur produit une matrice de taille 1x1 contenant le scalaire, et pas le scalaire.
Du coup j'ai trouvé une astuce en surchargeant l'opérateur de cast de cette manière:
Et la tout fonctionne, puisque le compilateur cast correctement la matrice 1,1 en _T automatiquement. Mais ça me plait pas trop car je suis pas a 100% sûr que ce cast ne s'effectuera que dans ce cas précis d'une matrice 1x1. J'aimerais donc que cette fonction ne soit active que dans la version 1x1 du code, pour que cette vérification se passe lors de la compilation.
Est-ce possible ? et si oui comment? Merci