Developpez.com - Rubrique C++

Le Club des Développeurs et IT Pro

Standard C++0x : Les concepts ne seront pas intégrés

Qu'en pensez-vous ?

Le 2009-07-13 18:11:42, par JolyLoic, Rédacteur/Modérateur
Bonjour,

Le vote a eu lieu aujourd'hui, et la décision a été prise de ne pas inclure les concepts dans C++0x. Les principaux arguments étaient que beaucoup d'acteurs estimaient que la proposition n'était pas assez mature, et risquait de repousser le standard.

Nous n'avons pas encore décidé comment le travail sur les concepts doit continuer, et quand ils pourront être intégrés dans le langage.
  Discussion forum
62 commentaires
  • hiura
    Membre actif
    Pour les ignorants comme moi, aurais-tu un lien de ce que sont les concepts ?
  • Goten
    Membre chevronné
    En gros ça permet de définir une interface que doit fournir un paramètre de template.
    Ca permet en premier lieu d'avoir des erreurs du compilo plus direct, par exemple si t'essayes de stocker dans un vecteur un objet qui n'est pas copi-able.

    Ca aurait permis d'écrire ce genre de chose :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <typename T> requires equalityComparable<T>
    bool isEqual(const T& lhs, const T& rhs)
    {
         return lhs==rhs;
    }
    
    // et on définit un concept comme ceci :
    
    auto concept equalityComparable<typename T>
    {
        bool operator==(const T&);
    }
    Désolé pour la pauvreté de l'exemple mais j'ai pas mieux en tête xD. D'ailleurs je suis pas sur de l'exactitude de la syntaxe du concept (au niveau de la définition de l'opérateur)

    J'ai pas de lien très poussé sous la main, jte retrouve ça.
  • JolyLoic
    Rédacteur/Modérateur
    Un des exemples fondateurs est std::sort. Si tu fais std::sort sur des itérateurs de std::list, tu auras un message d'erreur obscur qui parlera peut-être d'un problème avec un opérateur [] ou un opérateur + dans du code qui n'est pas à toi, mais fait partie de la bibliothèque standard.

    Avec des concepts, tu aurais eu une erreur dans ton code, indiquant que sort a besoin d'itérateurs à accès direct (RandomAccessIterator), et que tu lui as fourni des itérateurs d'un mauvais type.

    Le but étant de rendre les messages d'erreur des templates compréhensibles par le commun des mortels.

    Et ils permettaient aussi bien d'autres choses, entre autre une bonne gestion de l'overloading des templates, ce qui aujourd'hui doit se faire à la main avec des astuces et des classes de traits. Avec les concepts, les classes de traits auraient probablement disparu peu à peu.
  • hiura
    Membre actif
    D'accord, merci à vous deux.

    Je crois en fait que j'en avais déjà entendu parler. N'y avait-il pas l'intention d'introduire le mot clef where ?
  • 3DArchi
    Rédacteur
    Bonjour,
    Effectivement, c'est dommage.
    Entre autres, les concepts :
    -> jouent le rôle des classes traits : ils spécifient les exigences qu'un paramètre d'une classe/fonction template doit remplir (le code suivant ne suit pas la syntaxe exacte proposée mais illustre le propos ):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // définition d'un concept :
    concept Comparable<typename T> {
    bool operator<(T, T);
       // On spécifique qu'il doit exister un opérateur '<' de la forme indiquée ci-dessus.
    }
    
    // utilisation dans une fonction template :
    template<class T>
       requires Comparable<T>
    T min(T t1, T T2)
    {...
    _> jouent un peu le rôle des classes politiques avec les concept map : les concepts map permettent de dire comment un concept (un 'require') est rempli par une classe dans le cas où l'exigence n'est pas immédiate :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class personne {
    public:
    std::string nom;
    std::string prénom;
    };
    
    concept Comparable<typename T> {
    bool operator<(T, T);
    }
    
    concept_map Comparable<personne > { 
    // ca ne définit pas un opérateur '<' sur la classe personne
    // mais ça indique comment l'exigence doit être remplie
    bool operator<(const personne& a, const personne& b) {
    return (a.nom == b.nom) ?(
        (a.prénom == b.prénom)?
            false
            : (a.prénom< b.prénom))
        : (a.nom < b.nom)
    ;
    }
    Tu peux trouver des infos sur les concepts ici , ici ou
  • Alp
    Expert éminent sénior
    C'est bien dommage

    Qui plus est, j'avais commencé un article dessus
  • Goten
    Membre chevronné
    C'est "qu'un" article (pas péjoratif du tout hein), quand je pense au petit gars des compilo qui implémentait déjà cette feature, les glandes :p.
  • Alp
    Expert éminent sénior
    Envoyé par Goten
    C'est "qu'un" article (pas péjoratif du tout hein), quand je pense au petit gars des compilo qui implémentait déjà cette feature, les glandes :p.
    Oui, Doug Gregor doit avoir du mal à digérer ça, il était derrière Concept GCC, et les concepts en général je crois.
  • hiura
    Membre actif
    Merci pour les liens.

    De mon point de vue "utilisateur", c'est vrai que je suis déçu que ça soit repoussé au prochain std, mais en même temps je préfère ça à un ajournement du 0x.

    Pour le travail de Doug Gregor, n'y a-t-il pas un "plan" de prévu ? ( Du style une version de gcc qui accepte les concepts ? )
  • Alp
    Expert éminent sénior