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 :

Concepts et templates


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 1
    Par défaut Concepts et templates
    Bonjour à tous,

    Je suis entrain de me former sur les différentes notions qui ont récemment été introduites avec C++20. Parmi ces dernières, j'ai deux soucis de compréhension concernant les templates et les concepts.

    Supposons que je souhaite définir un concept qui représente un tableau (std::vector ou std::span); j'ai alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<class T>
    concept Array = std::is_same<std::vector<double>, T>::value || std::is_same<std::span<double>, T>::value;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<Array T>
    void print(const T& a) { std::cout << "Youpi! ca marche!\n"; }
    Ces fragments de code compilent et s’exécutent bien. Supposons maintenant que je souhaite définir un concept qui représente un tableau dont a taille est connue (std::array); j'ai alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<template<unsigned int> class T, unsigned int S>
    concept StaticArray = std::is_same<std::array<double, S>, T<S>>::value;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<StaticArray T>
    void print(const T& a) { std::cout << "Ploof! ca ne marche pas!\n"; }
    Ce code ne compile pas et je ne vois pas d'où vient l'erreur; d'où deux questions:
    1) d'où vient le problème?
    2) comment écrire un concept encore plus générique qui subsume les deux précédents (un array peut être static ou dynamique) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template<template<unsigned int> class T, unsigned int S>
    concept AbstractArray = std::is_same<std::vector<double>, T>::value || std::is_same<std::span<double>, T>::value || std::is_same<std::array<double, S>, T<S>>::value;
    Toute suggestion serait la bienvenue.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Ton problème vient du fait qu'un concept (tel que tu tentes de l'utiliser) ne doit avoir qu'un seul paramètre template de la forme template <class /* ou typename */ T> concept LeConcept = .... La vérification se fait alors avec LeConcept</* le type déduit lors de l'appel */>. Or ici, tu en as deux et qui plus est aucun n'attend un type.

    Il est possible d'en avoir plusieurs, mais il faut alors passer les paramètres supplémentaires explicitement (attention, le type déduit est inséré en première position). Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class V, typename T>
    concept Vector = std::is_same<std::vector<T>, V>::value;
     
    template <Vector<double> T> // Vector<T, double>
    void print(const T& a) { std::cout << "Youpi! ça marche!\n"; }
    Le plus simple est de passer par une classe de traits à spécialiser selon les éléments que tu espères vrais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <class T> struct is_abstract_array : std::false_type {};
     
    template <>              struct is_abstract_array< std::vector<double>   > : std::true_type {};
    template <>              struct is_abstract_array< std::span<double>     > : std::true_type {};
    template <std::size_t N> struct is_abstract_array< std::array<double, N> > : std::true_type {};
     
    template <class T>
    concept AbstractArray = is_abstract_array<T>::value;
    Dernière modification par Invité ; 14/08/2022 à 02h43.

Discussions similaires

  1. [conception] Réalisation template multi langue
    Par shelko dans le forum Langage
    Réponses: 1
    Dernier message: 18/09/2008, 17h36
  2. Réponses: 6
    Dernier message: 02/12/2007, 15h10
  3. [POO] Conception d'un système de template
    Par iwf-fr dans le forum Langage
    Réponses: 8
    Dernier message: 06/02/2007, 13h29
  4. Réponses: 11
    Dernier message: 03/05/2006, 15h12

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