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 :

Disponibilité des "move-semantics" ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut Disponibilité des "move-semantics" ?
    Bonjour à tous,

    Je fournis une classe A via une API qui se veut "portable", et j'aimerais si possible y intégrer une sémantique de mouvement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A {
        A() {}
        A(const A& other) {}
        A& operator=(const A& other) {}
        ~A() {}
     
        #ifdef MOVESEMANTICS_AVAILABLE
        A(A&& other) {}
        A& operator=(A&& other) {}
        #endif
    };
    Y a-t-il une manière simple (via la STL par exemple) de définir ce MOVESEMANTICS_AVAILABLE, pour savoir si un compilo gère ou non cette fonctionnalité ? Ou faut-il le déterminer soi-même à coup de #ifdef, compilo par compilo, version par version ?

    PS: D'ailleurs, peut-on seulement exporter une rvalue-reference dans une DLL ?

    Merci.

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Il n'y a rien de standard pour ca. Le standard definis juste une macro qui dis la version du C++.
    Si tu utilises Boost il y a une macro pour ca (mais va falloir la chercher...)

  3. #3
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    PS: D'ailleurs, peut-on seulement exporter une rvalue-reference dans une DLL ?
    Cette question n'a pas beaucoup de sens: une r-value reference ne peut pas exister dans une interface (membre de classe par exemple ou directement exporte), donc tu ne pourrais pas l'exporter ou l'importer puis que ca n'existe que dans du code.

    Par contre dans l'interface d'une fonction (membre ou pas) qui elle meme est exportee, oui sans souci, ce n'est qu'une reference (qui a une semantique particuliere mais c'est pour le compilo, du point de vue du linker c'est juste une reference/pointeur).

    Enfin en tout cas chez moi ca marche bien.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Par contre dans l'interface d'une fonction (membre ou pas) qui elle meme est exportee, oui sans souci, ce n'est qu'une reference (qui a une semantique particuliere mais c'est pour le compilo, du point de vue du linker c'est juste une reference/pointeur).
    Oui, je parlais d'une rvalue en tant que paramètre de fonction bien sûr.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class A {
        A(A& other) {}
        A(A&& other) {}
    };
    J'imagine que ces deux constructeurs peuvent coexister, et que le name-mangling produit deux nom différents, dont un spécifique aux rvalue-references ?...

    -- EDIT --
    Effectivement, Boost pourra peut-être m'être utile.
    Je suis notamment tombé sur cette page :
    http://www.boost.org/doc/libs/1_53_0..._not_supported
    Par contre ça risque de me faire inclure des tonnes de headers Boost dans mon API. Pas génial, ça.

  5. #5
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Citation Envoyé par cob59 Voir le message
    J'imagine que ces deux constructeurs peuvent coexister, et que le name-mangling produit deux nom différents, dont un spécifique aux rvalue-references ?...
    A priori oui.

    Effectivement, Boost pourra peut-être m'être utile.
    Je suis notamment tombé sur cette page :
    http://www.boost.org/doc/libs/1_53_0..._not_supported
    Par contre ça risque de me faire inclure des tonnes de headers Boost dans mon API. Pas génial, ça.
    Regarde dans les dis headers, il se peut que tu puisses extraire le code et le mettre dans un header a toi. Si c'est pas le cas, ca peut etre parcequ'ils ont des configurations par compilateur, et donc tu as mieux fais d'utiliser leur macro en effet.
    Oui ca ajouterai aussi boost (ou au moins ces headers) aux requirements pour utiliser ta bibliotheque.

    Si ca pose un probleme, tu as mieux fait de faire en sorte que move-semantic soit une option qui soit activee (ou desactivee) a la main, de maniere a ce que l'utilisateur controle explicitement l'option. Si tu utilises CMake ca ne devrait pas etre difficile a mettre en place.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    OK je vais voir ce que je peux faire avec BOOST_NO_CXX11_RVALUE_REFERENCES, ou sinon via une option dans mon CMake.
    Merci !

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 30/11/2007, 11h58

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