[C++] Templates et surcharges..

Templates et surcharges.. [C++] - C++ - Programmation

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:

Code :
  1. template<class _T, int _WIDTH, int _HEIGHT>
  2. class Matrix


 
 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 :

Code :
  1. template<int _RHSWIDTH>
  2. Matrix<_T, _RHSWIDTH, _HEIGHT> operator * (const Matrix<_T, _RHSWIDTH, _WIDTH> &rhs) const;


 
Jusque la tout va bien. La on ça se corse c'est que je veux aussi pouvoir écrire:  

Code :
  1. x = M*A + c


 
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:

Code :
  1. operator _T() { return element[0]; }


 
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

Reply

Marsh Posté le 27-01-2013 à 23:54:13   

Reply

Marsh Posté le 28-01-2013 à 08:19:32    

l'explicit template specialization peut il se faire dans ce cas ?


Message édité par Profil supprimé le 28-01-2013 à 09:59:49
Reply

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 :
  1. template<class _T>
  2.     _T operator +(const Matrix<_T,1,1> &rhs,const _T &scalar){ return rhs.element[0] + scalar; }
  3. template<class _T>
  4.     _T operator -(const Matrix<_T,1,1> &rhs,const _T &scalar){ return rhs.element[0] - scalar; }
  5. template<class _T>
  6.     _T operator *(const Matrix<_T,1,1> &rhs,const _T &scalar){ return rhs.element[0] * scalar; }
  7. template<class _T>
  8.     _T operator /(const Matrix<_T,1,1> &rhs,const _T &scalar){ return rhs.element[0] * scalar; }


 
ça doit marcher non ?
 
Cdlt,
 
dreameddeath


Message édité par dreameddeath le 28-01-2013 à 11:06:01
Reply

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

Reply

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.

Reply

Marsh Posté le 28-01-2013 à 13:45:39    

Effectivement ça à l'air de marcher.. Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed