Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1331 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Templates et surcharges..

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Templates et surcharges..

n°2172819
Profil sup​primé
Posté le 27-01-2013 à 23:54:13  answer
 

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

mood
Publicité
Posté le 27-01-2013 à 23:54:13  profilanswer
 

n°2172825
Profil sup​primé
Posté le 28-01-2013 à 08:19:32  answer
 

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


Message édité par Profil supprimé le 28-01-2013 à 09:59:49
n°2172841
dreameddea​th
Posté le 28-01-2013 à 11:05:23  profilanswer
 

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
n°2172847
Profil sup​primé
Posté le 28-01-2013 à 11:44:02  answer
 

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

n°2172858
Farian
Posté le 28-01-2013 à 13:21:30  profilanswer
 

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.

n°2172861
Profil sup​primé
Posté le 28-01-2013 à 13:45:39  answer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Templates et surcharges..

 

Sujets relatifs
Programmation C sous CodeBlocksC++ liste chainée
[C#] Obtenir la couleur rouge d'un pixel [Résolu]Programme en C
Algorithme débutant C++ adressage IP[C]Problème d'écriture avec fopen/fprintf et énumération bancale
Proxy cache en CBibliothèque C accès WEB
[C/Reseau] proxy FTP (simple) en C[C#]marque l'exception xamlparseexception n'a pas été gérée
Plus de sujets relatifs à : [C++] Templates et surcharges..


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR