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

Langage C++ Discussion :

Conversion implicite et surcharge d'opérateur


Sujet :

Langage C++

  1. #1
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut Conversion implicite et surcharge d'opérateur
    Hello,

    Ce qui suit est un bout de code épuré (de beaucoup de choses) concernant une librairie de calcul matriciel.

    L'idée est de construire des expressions sous forme d'arbre, grâce à l'application d'une succession d'opérateurs et fonctions, puis de résoudre le calcul grâce à la conversion implicite.

    Je pensais cela possible, j'ai quelques doutes face à certaines difficultés.
    Ici, apparemment, ce qui m'embête est que le C++ n'accepte qu'une seule conversion implicite définie par l'utilisateur à la fois.
    Le code qui suit instancie des matrices (mat), et je m'attendais à ce que ces mat soient converties implicitement en ExprMat, qui sont un type dérivé de Expr. Seulement, le compilateur cherche à convertir mat directement en Expr.

    Des idées ?

    Code c++ : 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
    class mat;
    class Expr;
    class ExprMat : public Expr{
      ExprMat(mat& x);
    }
     
    class ExprAdd : public Expr{
      ExprAdd(Expr* left, Expr* right);
      operator mat();
    }
     
    template<class L, class R>
    ExprAdd operator+(L& left, R& right){
      return ExprAdd(&left, &right);
    }
     
    // stuff
     
    mat a,b;
    mat c = a+b;

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Le message d'erreur exacte aurait été bien

    Si tu as plusieurs conversion implicite possible, le compilateur va avoir un problème pour trouver la bonne, c'est normal. Voir le détail des règles de résolution d'appel de fonction

    Sinon, ça se fait sans problème ce que tu veux faire, ça porte même un nom : "expression template", et comme le nom l'indique, ça se base sur les templates. Voir Les "expression templates", ou comment booster vos calculs matriciels ou un bon livre de méta prog C++ (Vandervoorde; Abhrams)

  3. #3
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Ouaip, je viens de trouver une solution qui se base également sur les templates.
    Très intéressant l'article de l'autre côté aussi. Je vais m'en inspirer.

    Merci

  4. #4
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Je viens de réaliser...

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Spécialisation pour l'addition
    template <class T, class U> struct BinaryOp<T, U, Add> : public BinaryOpBase<T, U>
    {
        BinaryOp(T I1, U I2) : BinaryOpBase<T, U>(I1, I2) {}
        inline double operator *() {return *It1 + *It2;}
    };

    BinaryOp(T i1...), pas de référence ici. Si jamais i1 est une matrice 10000x10000, c'est pas top non ?

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Ce ne sont pas des matrices qui sont passé à ce niveau, mais des opérateurs qui permettent de construire l'arbre
    Les matrices sont passées aux feuilles de l'arbre, qui utilise des vector const& et des itérateurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Opérateur de conversion implicit + dérivation
    Par mister3957 dans le forum C++
    Réponses: 5
    Dernier message: 13/05/2009, 14h50
  2. [C#] Tri d'objet et surcharge d'opérateur
    Par Royd938 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/12/2007, 00h26
  3. Problème de surcharge d'opérateurs
    Par Hell dans le forum C++
    Réponses: 17
    Dernier message: 17/01/2005, 16h01
  4. Cumul de surcharges d'opérateurs
    Par Nats dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2004, 13h37
  5. [VB .NET] Surcharge d'opérateur
    Par Franckintosh dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2004, 19h05

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