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 :

C++0x : l'association d'espaces de noms


Sujet :

Langage C++

  1. #1
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut C++0x : l'association d'espaces de noms
    Bonjour,
    J'ai beau lire la n2535 et la n1344, les inline namespace me semblent assez anecdotiques.
    Effectivement, dans le code suivant, la différence de comportement pour l'appel de g peut surprendre :
    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
    namespace Lib
    {
      namespace Lib_1
      {
        struct A{};
      }
      struct B{};
     
      template <typename T> void g(T){}
    }
     
    int main()
    {
      Lib::Lib_1::A a;
      g(a); // Erreur
      Lib::B b;
      g(b); // OK
      return 0;
    }
    Ne maîtrisant pas sur les doigts les name lookup et en particulier les argument-dependent name lookup, j'aurais de toute façon tendance à écrire :
    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
    namespace Lib
    {
      namespace Lib_1
      {
        struct A{};
      }
      struct B{};
     
      template <typename T> void g(T){}
    }
     
    int main()
    {
      Lib::Lib_1::A a;
      Lib::g(a);
      Lib::B b;
      Lib::g(b);
      return 0;
    }
    Ce code fonctionne sans problème. Et je pense que j'aurais toujours tendance à écrire ce dernier code plutôt que celui-ci :
    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
    namespace Lib
    {
      inline namespace Lib_1
      {
        struct A{};
      }
      struct B{};
     
      template <typename T> void g(T){}
    }
     
    int main()
    {
      Lib::Lib_1::A a;
      g(a);
      Lib::B b;
      g(b);
      return 0;
    }
    De la même façon, pour les spécialisations de template, j'écrirais plus volontiers la spécialisation dans l'espace de nom approprié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace Lib
    {
      namespace Lib_1
      {
         template<class T>
        struct A{};
      }
      struct B{};
      namespace Lib_1
      {
          template<> struct A<B>{};
      }
    }
    qu'avec une association de nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    namespace Lib
    {
      inline namespace Lib_1
      {
         template<class T>
        struct A{};
      }
      struct B{};
      template<> struct A<B>{};
    }
    Du coup, je me demande si je ne passe pas à côté de quelque chose avec cette évolution. Je n'arrive pas à vraiment saisir son intérêt.
    Qu'en pensez-vous ?

  2. #2
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Je pense que l'essentielle est dans :
    Members of an inline namespace can be used in most respects as though they were members of the enclosing namespace. Specifically, the inline namespace and its enclosing namespace are considered to be associated namespaces ([basic.lookup.argdep]) of one another, and a using directive ([namespace.udir]) which names the inline namespace is implicitly inserted into the enclosing namespace. Furthermore, each member of the inline namespace can subsequently be explicitly instantiated ([temp.explicit]) or explicitly specialized ([temp.expl.spec]) as though it were a member of the enclosing namespace. Finally, looking up a name in the enclosing namespace via explicit qualification ([namespace.qual]) will include members of the inline namespace brought in by the using directive even if there are declarations of that name in the enclosing namespace..
    En gros, c'est de la "fusion" de namespace... Du moins, c'est ce que je crois en avoir compris.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  3. #3
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Je pense que tu prend le problème dans le mauvais sens. A ce que j'ai compris (je n'ai suivi ça que de très loin, donc tout ce que je dis est encore plus sujet à caution que d'habitude), la problématique n'est pas : j'ai un namespace dans un autre namespace, comment rendre le name lookup plus simple.

    La problématique est plutôt comment gérer le versionnement. Et la solution proposée avait des problèmes de name lookup, ce qui fait qu'il a fallu détailler ce qui se passe dans ce genre de situations. Mais c'est plutôt un détail technique qu'une vraie fonctionnalité.

    Le versionnement part de l'idée :
    J'ai une bibliothèque dans un namespace V1, j'en ai une version plus récente dans un espace de noms V2. Comment faire pour :
    - que les gens qui veulent spécifiquement utiliser V1 puissent le faire
    - que les gens qui veulent spécifiquement utiliser V2 puissent le faire
    - que les gens qui s'en moquent ne précisent rien, et qu'ils basculent sans effort de V1 vers V2.
    Tout ça dans un seul code (donc les deux versions sont présentes dans l'environnement de compilation)

    Solution proposée : Les utilisateurs classiques utilisent les objets dans un espace de nom MaLib, qui en interne contient V1 et V2, et un inline rend l'un des deux accessible par défaut. Donc selon un choix global, MaLib::A référencera implicitement V1::A ou V2::A, et MaLib::V1::A ou MaLib::V2::A seront explicites.

    Et puis, du coup, ce qui reste commun à V1 et V2, plus besoin de le définir 2 fois, on le met juste dans MaLib.

    L'idée est assez simple. Après seulement arrivent les détails scabreux...
    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.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Merci pour cette réponse.
    Citation Envoyé par JolyLoic Voir le message
    Je pense que tu prend le problème dans le mauvais sens.
    C'est bien ce que je me disais
    Citation Envoyé par JolyLoic Voir le message
    La problématique est plutôt comment gérer le versionnement. Et la solution proposée avait des problèmes de name lookup, ce qui fait qu'il a fallu détailler ce qui se passe dans ce genre de situations.
    C'est exactement ce que raconte le papier de sutter (le n1344 du premier post ou sur gotw).
    Mais, en le lisant ça m'a eu l'air très 'exercice de style'. Je n'ai jamais eu à utiliser de bibliothèque qui gère conjointement 2 versions. En général, tu changes de versions == tu migres, avec éventuellement quelques changements de code.
    Sutter pose le problème std/std2. Auquel cas, je peux comprendre. Mais, au final, il y aura un espace de nom std2 ? Et à part la STL, est-ce que se problème va vraiment se poser ?
    Citation Envoyé par JolyLoic Voir le message
    Mais c'est plutôt un détail technique qu'une vraie fonctionnalité.
    Vue ainsi ça risque de s'ajouter à la liste de ceux qui pensent que le C++ est un langage trop compliqué car trop subtil

  5. #5
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Vue ainsi ça risque de s'ajouter à la liste de ceux qui pensent que le C++ est un langage trop compliqué car trop subtil
    Je sais pas trop, pour moi cela s'ajoute au nombreux "truc pratique". Un peu comme si le c++ était bourré d'astuces.

    C'est plutôt au compilateur d'être subtil pour ça, pas au codeur. Rien ne t'oblige à l'utiliser... Contrairement à des langage tout objet par exemple ou tu es OBLIGE de faire parfois quelque chose de rudement compliquer pour rien...
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Mais, en le lisant ça m'a eu l'air très 'exercice de style'. Je n'ai jamais eu à utiliser de bibliothèque qui gère conjointement 2 versions
    C'est un probleme que nous avons. Je pense que n'importe quel produit soft assez gros fini par l'avoir. Certains se donnent comme contraintes de l'eviter a tout prix, mais quand il y a des clients et des partenaires dans la boucle, le prix peut etre tres eleves. (Je connais mal, pour ne pas dire pas, le monde Windows, mais sous Unix les bibliotheques systemes sont ainsi versionnees. C'est un peu plus facile dans ce cadre -- il suffit de jouer avec l'editeur de liens -- mais quand on a des inlines et des templates, un support du langage aide a mettre en place des solutions robustes qui ne sont pas a base de macros et de scripts immondes).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    C'est un probleme que nous avons. Je pense que n'importe quel produit soft assez gros fini par l'avoir.
    Comme je l'ai dit, dans les projets où je suis intervenu, c'est plus souvent géré à coup de gestion de conf et de migration. Mais, il est vrai que je ne suis intervenu que sur des projets 'prduits finis' (pas de bibliothèques) et pas dans des contextes multi-partenaires (plutôt le grand écart : mono client ou grand public et bibliothèques/framework du marché). D'où probablement mon biais de perception.
    Merci pour ce complément.
    Donc, si je résume, l'objectif des associations d'espaces de noms est bien la gestion des différentes versions comme le présente Sutter dans l'article.

  8. #8
    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
    Points : 3 344
    Points
    3 344
    Par défaut
    J'ai bossé dans une boite ou il y avait ce problème avec un "produit fini", qui avait plusieurs versions selon les détails que voulaient changer les clients (principalement des resources graphiques, mais aussi des menus additionels ou retirés, et parfois des modifications plus importantes).

    Par contre il m'a toujours semblé qu'utiliser les branches d'un système de controle de source était suffisant.

    J'ai lu la description de cette feature aussi et l'avais compris comme un moyen de changer de version par défaut facilement (je crois que c'était l'explication de Stroustrup).

    Personellement ca me fait bizarre une feature concernant le versionning dans un language de programmation...

    Mais si ça peut permettre d'implémenter une autre feature plus importante alors pourquoi pas, la plupart des gens ignoreront ce point de toutes manières.

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Comme le dit Loïc, ça permet juste d'appuyer sur un levier pour promouvoir un namespace à une portée au-dessus (au niveau enclosing). C'est juste quelque chose qui permettra de faire joujou un peu plus avec les namespaces et l'ADL. Comme ça ne cassera aucun code et qu'apparemment la demande était assez forte, ç'a fait son chemin

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Un des exemples où utiliser des variantes dans un même programme a du sens est quand les versions différentes sont debug/non debug (p.e. pour la lib standard).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. [XSL] problème avec copy espace de nom
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2005, 15h18
  2. [d6][expert WSDL] problème d'espace de nom.
    Par tchup dans le forum Web & réseau
    Réponses: 1
    Dernier message: 01/09/2005, 14h46
  3. Supprimer les espaces des noms de fichier
    Par Cathy dans le forum Linux
    Réponses: 20
    Dernier message: 04/08/2005, 17h13
  4. [typedef] protection à travers les espaces de noms
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 7
    Dernier message: 02/02/2005, 20h21

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