IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

m�taprogrammation, expression templates et conversion de types


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    58
    D�tails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Par d�faut m�taprogrammation, expression templates et conversion de types
    Bonjour,

    pour apprendre la m�taprogrammation et comprendre les expressions templates, je suis entrain de "jouer" avec une petite classe vecteur et je voudrait savoir s'il existe une solution au probl�me que je me suis pos� :

    chaque vecteur est d�fini par un type et une dimension :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<class type, int dim>
    class vecteur
    {
    protected:
      type val[ dim];
    ...
    };
    je d�sire simplement effectuer, � l'aide des expressions templates, l'addition de deux vecteurs. Existe-t-il un moyen d'additionner deux vecteurs dont le type est diff�rent, tout en respectant les r�gles de conversions standards (sans se pr�occuper des dimensions dans un premier temps). Par exemple,
    la somme de deux variables mettant en jeu un float et un int donne un float par la conversion implicitement du int en float. En clair, est-t-il possible que la surcharge de l'op�rateur + avec deux vecteurs de types diff�rents puisse donner en sortie un vecteur du type le plus grand ?

    Exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    vecteur<int, 4> vi;
    vecteur<double,4> vd;
     
    vi + vd;  // conceptuellement, la somme des deux vecteurs
    //devrait donner un vecteur de type vecteur<double, 4>
    Je ne sais pas si j'ai �t� assez clair, et je remercie toutes les personnes qui auront eu la patiente de me lire jusqu'au bout

    Merci beaucoup.

  2. #2
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    C'est possible, simplement � un moment o� un autre tu auras besoin d'une structure qui d�finit ces r�gles de conversion, genre une classe de traits.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <typename T1, typename T2> struct MachinTraits;
     
    template <> struct MachinTraits<float, int>  {typedef float Type;};
    template <> struct MachinTraits<double, int> {typedef double Type;};
    template <> struct MachinTraits<char, int>   {typedef int Type;};
    // ... pour chaque paire de types !
     
     
    template <typename T1, typename T2>
    Vector<MachinTraits<T1, T2>::Type> operator +(const Vector<T1>&, const Vector<T2>&);
    Apr�s, il y a peut-�tre moyen de faire �a plus simplement (genre en utilisant la taille pour les types entiers), mais l'id�e est l�.

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    58
    D�tails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Par d�faut
    Merci Laurent,

    il y a encore bien des aspects que je ne ma�trise pas en C++ (dont les traits). Il faudrait que je trouve une r�f�rence bien compl�te sur le sujet.

  4. #4
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    The Complete Template Guide, de Vandevoorde et Josutis, est indispensable si on touche aux templates en profondeur.

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    58
    D�tails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Par d�faut
    D�cid�ment, quelle r�activit� sur le forum, je suis vraiment impressionn�

    Je suis entrain de tester la m�thode avec les traits. M�me si c'est un peu lourd, en se limitant � quelques types, c'est encore g�rable. Encore quelques petites erreurs � corriger et je posterai le source (aidera-t-il quelqu'un ?)

    Dans tous les cas, merci beaucoup � tous, je vais de ce pas voir la r�f�rence.

  6. #6
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    On peut aussi faire typeof(double(0) + float(0)) si tu utilises GCC ou autre avec extensions du genre (qui devraient �tre aussi disponibles dans C++09)

    On peut peut-�tre le faire aussi avec result_of, mais je vois pas trop comment.

  7. #7
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 295
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par d�faut
    Citation Envoy� par grob1212
    Encore quelques petites erreurs � corriger et je posterai le source (aidera-t-il quelqu'un ?)
    Oui bien s�r. Il y a un topic d�di� � cela sur le forum. Tout code (propre et qui fonctionne) est le bienvenu

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par d�faut
    J'ai moi m�me �t� confront� � ce genre de probl�mes pour l'impl�mentation d'une biblioth�que math�matique (GPL):
    http://www.ient.rwth-aachen.de/team/...al/genial.html

    Regarde plus particuli�rement la page suivante de ma doc (en anglais):
    http://www.ient.rwth-aachen.de/team/...e70180x34f6b7c

    Voici la syntaxe que j'utilise:

    DenseVector<int>::self X(4,1); // X=[1 1 1 1]
    DenseVector<float>::self Y(4,1.5); // Y=[1.5 1.5 1.5 1.5]
    cout << X+Y << endl; // [2.5 2.5 2.5 2.5]
    cout << X+value_cast<int>(Y) << endl; // [2 2 2 2]

  9. #9
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par Jean-Marc.Bourguet
    The Complete Template Guide, de Vandevoorde et Josutis, est indispensable si on touche aux templates en profondeur.
    C'est C++ Templates, the complete guide le titre, et j'appuie Jean-Marc quant � la qualit� de ce livre.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  10. #10
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    J'ai moi m�me �t� confront� � ce genre de probl�mes pour l'impl�mentation d'une biblioth�que math�matique (GPL):
    http://www.ient.rwth-aachen.de/team/...al/genial.html

    Regarde plus particuli�rement la page suivante de ma doc (en anglais):
    http://www.ient.rwth-aachen.de/team/...e70180x34f6b7c
    Ce qui aurait �t� int�ressant serait que tu nous dises comment tu as g�r� �a dans ton code

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par d�faut
    Citation Envoy� par Laurent Gomila
    Ce qui aurait �t� int�ressant serait que tu nous dises comment tu as g�r� �a dans ton code
    Mon impl�mentation des "expression templates" utilise en arri�re plan le genre de m�ta-programmation suivante. Il est possible de faire plus �volu� pour choisir les promotions, mais cette impl�mentation m'a toujours suffis.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    template<int cond,class A, class B> struct IF {};
    template<class A,class B> struct IF<0, A, B> { typedef B RET; };
    template<class A,class B> struct IF<1, A, B> { typedef A RET; };
     
    template<int m,int n> struct EQUAL         { enum { RET=(m==n)?1:0 }; };
    template<int m,int n> struct NOT_EQUAL     { enum { RET=(m!=n)?1:0 }; };
    template<int m,int n> struct LOWER         { enum { RET=(m<n)?1:0 }; };
    template<int m,int n> struct GREATER       { enum { RET=(m>n)?1:0 }; };
    template<int m,int n> struct LOWER_EQUAL   { enum { RET=(m<=n)?1:0 }; };
    template<int m,int n> struct GREATER_EQUAL { enum { RET=(m>=n)?1:0 }; };
     
     
     
     
    template<class T> struct promotion {  };
     
    #define DECLARE_PROMOTION(TYPE,RANK) template<> struct promotion< TYPE > { enum { rank = RANK }; }; template<> struct promotion<const TYPE > { enum { rank = RANK }; };
     
    DECLARE_PROMOTION(unsigned char,         1)
    DECLARE_PROMOTION(char,                  2)
    DECLARE_PROMOTION(unsigned short,        3)
    DECLARE_PROMOTION(short,                 4)
    DECLARE_PROMOTION(unsigned int,          5)
    DECLARE_PROMOTION(int,                   6)
    DECLARE_PROMOTION(unsigned long,         7)
    DECLARE_PROMOTION(long,                  8)
    DECLARE_PROMOTION(float,                 9)
    DECLARE_PROMOTION(double,               10)
    DECLARE_PROMOTION(long double,          11)
     
    template<class T>
    struct promotion_traits
    {
      typedef T value_type;
    };
     
    template<class T>
    struct promotion_traits<const T>
    {
      typedef typename promotion_traits<T>::value_type value_type;
    };
     
    template<class T1,class T2>
    struct promotion2_traits
    {
      typedef typename IF<LOWER<promotion<T1>::rank,promotion<T2>::rank>::RET, T2, T1>::RET value_type;
    //  typedef T1 value_type;
    };
     
    template<class T1,class T2> struct promotion2_traits<const T1,      T2> { typedef typename promotion2_traits<T1,T2>::value_type value_type; };
    template<class T1,class T2> struct promotion2_traits<      T1,const T2> { typedef typename promotion2_traits<T1,T2>::value_type value_type; };
    template<class T1,class T2> struct promotion2_traits<const T1,const T2> { typedef typename promotion2_traits<T1,T2>::value_type value_type; };
     
    template<class G> class Vector;
    template<class G,class V> struct promotion2_traits<Vector <G>,complex<V> > { typedef typename Vector<G>::template rebind<typename promotion2_traits<typename Vector<G>::const_value_type,complex<V> >::value_type>::other value_type; };
    template<class V,class G> struct promotion2_traits<complex<V>,Vector <G> > { typedef typename Vector<G>::template rebind<typename promotion2_traits<complex<V>,typename Vector<G>::const_value_type >::value_type>::other value_type; };
     
    template<class G> class Matrix;
    template<class G,class V> struct promotion2_traits<Matrix <G>,complex<V> > { typedef typename Matrix<G>::template rebind<typename promotion2_traits<typename Matrix<G>::const_value_type,complex<V> >::value_type>::other value_type; };
    template<class V,class G> struct promotion2_traits<complex<V>,Matrix <G> > { typedef typename Matrix<G>::template rebind<typename promotion2_traits<complex<V>,typename Matrix<G>::const_value_type >::value_type>::other value_type; };
     
    template<int D,class G> class Array;
    template<int D,class G,class V>   struct promotion2_traits<Array<D,G >,complex<V>  > { typedef typename Array<D,G>::template rebind<typename promotion2_traits<typename Array<D,G>::const_value_type,complex<V> >::value_type>::other value_type; };
    template<class V,int D,class G>   struct promotion2_traits<complex<V> ,Array<D,G > > { typedef typename Array<D,G>::template rebind<typename promotion2_traits<complex<V> ,typename Array<D,G>::const_value_type>::value_type>::other value_type; };
     
     
    template<class T1,class T2,class T3>
    struct promotion3_traits
    {
      typedef typename promotion2_traits<typename promotion2_traits<T1,T2>::value_type, T3>::value_type value_type;
    //  typedef T1 value_type;
    };
     
    #define PROMOTE(T) typename promotion_traits< T >::value_type
    //#define PROMOTE2(T1,T2) T1
    #define PROMOTE2(T1,T2) typename promotion2_traits< T1,T2 >::value_type
    //#define PROMOTE3(T1,T2,T3) T1
    #define PROMOTE3(T1,T2,T3) typename promotion3_traits< T1,T2,T3 >::value_type

  12. #12
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    58
    D�tails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 58
    Par d�faut
    Merci Charlemagne, et joli travail. Je crois que tout cela va me faire progresser rapidement. Mon probl�me est que je ne raisonne pas encore en consid�rant la m�ta-programmation comme un langage � part enti�re (en somme j'ai encore du mal � me faire aux IF<>...), mais ca va venir.

    A titre de curiosit� combien de temps as-tu mis pour d�velopper ta librairie (en s�parant la formation aux expression templates du d�veloppement proprement dit) ? Etait-ce seul ou en �quipe ?

    Merci � tous pour ces contributions. Si vous en avez d'autres je suis preneur

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par d�faut
    Citation Envoy� par grob1212
    A titre de curiosit� combien de temps as-tu mis pour d�velopper ta librairie (en s�parant la formation aux expression templates du d�veloppement proprement dit) ? Etait-ce seul ou en �quipe ?
    Seul. (mes coll�gues ne programment qu'en C ou Matlab)
    J'ai d�but� la librairie y'a environ 6 ans.
    Depuis 1 an, je n'y apporte plus trop d'extensions, je me contente principalement de la maintenir.
    J'ai pas mal d'autres modules math�matiques rattach�s � cette librairie, dont je me sers en traitement d'images, mais j'estime qu'ils ne sont pas assez g�n�raux, utiles ou accomplis pour �tre mis en ligne.

    S�parer le temps de programmation des "expression templates" du reste n'est pas facile car je n'utilise pas vraiment les "expression templates", mais une impl�mentation personnelle qui est indissociable des vecteurs/matrices.
    Dans l'ensemble, mes containers Vector/Matrix n'ont plus trop �volu�s apr�s la 1�re ann�e de programmation, repr�sentant peut-�tre 6 mois de travail � temps plein. Mais par la suite, bien d'autres modules sont venus se greffer...

Discussions similaires

  1. R�ponses: 2
    Dernier message: 02/05/2011, 21h58
  2. R�ponses: 33
    Dernier message: 16/01/2009, 14h02
  3. Conversion de type
    Par poirier dans le forum ASP
    R�ponses: 2
    Dernier message: 06/07/2004, 10h30
  4. [MYSQL] conversion de type sur import de script
    Par sebos63 dans le forum SQL Proc�dural
    R�ponses: 2
    Dernier message: 27/08/2003, 10h00
  5. R�ponses: 2
    Dernier message: 05/06/2002, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo