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 :

Patron de classe et identification du type du parametre


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Par défaut Patron de classe et identification du type du parametre
    Bonjour,

    J'ai une classe template Bmp qui contient une image bitmap. Cette classe peut être instanciée
    avec un type ou un type RBG24_t Gray_t.

    Le RGB24_t contient:
    un champ de 8 bits pour le rouge
    un champ de 8 bits pour le vert
    un champ de 8 bits pour le bleu

    Le Gray_t contient:
    -un champ de 8 bits pour l'intensité de gris

    Je tiens à ajouter une méthode pour calculer l'intensité moyenne. mais elle doit travailler différemment
    selon le paramètre:

    Pour RGB24_t:

    averageRed = somme de la composante rouge / nb pixels
    averageGreen = somme des composante verte / nb pixels
    averageBlue = somme des composante bleue / nb pixels


    Pour Gray_t:

    moyenne = somme de l'intensité de gris / nb pixels


    La déclaration devrait ressembler a:

    ComputeAverageIntensity int (composant char); / / le composant est «r», «g», «b», «a», où a est pour le gris.

    Mais comment la méthode peut-elle connaître le type d'instanciation? Elle doit verifier que le «a» est utilisé uniquement quand Gray_t est utilisé, aucun r, g, b lorsque Gray_t est utilisé, seul r, g, b lorsque RBG24_t.

    Vous pouvez proposer une autre mise en œuvre de la méthode, mais je ne peux pas changer le fait que la classe est un template.

    je vous remercie!

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    La réponse tiens en deux mots :

    traits
    policy

    Les traits sont des classes qui donnent des informations sur le type passé en paramètre, tandis que les policy sont des stratégies appliquées au type en question. On peut combiner les deux, pour un résultat intéressant.

    Il est important de noter que les traits en particuliers sont nés de la possibilité de spécialiser (partiellement ou complètement) un template déjà défini pour en modifier la définition et/ou le comportement.

    Généralement, les traits s'utilisent ainsi :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    // traits de base : ne défini rien ; il est illégal de l'utiliser
    template <class T>
    struct color_traits
    { };
     
    // spécialisé pour rgb_t
    template <>
    struct color_traits<rgb_t>
    {
        typedef int average_type;
        average_type compute_average(const rgb_t& c)
        { return (int(c.r) + int(c.g) + int(c.b)) / 3; }
    };
     
    // spécialisé pour gray_t
    template <>
    struct color_traits<gray_t>
    {
        typedef int average_type;
        average_type compute_average(const gray_t& c)
        { return int(c); }
    };
     
    template <class T, class Traits = color_traits<T> >
    class color
    {
    public:
        typedef color<T,Traits> self_type;
        typedef Traits traits_type;
        typedef T value_type;
     
    private:
        value_type m_color;
     
    public:
       static typename traits_type::average_type 
         compute_average(const self_type& c)
       {
          return traits_type::compute_average(c.m_color);
       }
       typename traits_type::average_type 
         compute_average()
       {
          return traits_type::compute_average(m_color);
       }
    };
    Lorsque tu instancies color<rgb_t>, il utilise par défaut le color_traits<rgb_t>, mais tu peux en spécifier un autre (au cas où tu aimes changer les comportements ). Lorsque tu instancie color<gray_t>, c'est color_traits<gray_t> qui est automatiquement utilisé.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. [Template] Patron de classe
    Par houcem001 dans le forum C++
    Réponses: 8
    Dernier message: 27/10/2008, 14h29
  2. Réponses: 3
    Dernier message: 21/08/2008, 13h33
  3. Types génériques: Class is a raw type
    Par lexsteens dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 22/03/2008, 04h40
  4. patron de classe
    Par Azharis dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2005, 07h17
  5. Dériver un patron de classe à partir du patron ?
    Par Serge Iovleff dans le forum C++
    Réponses: 4
    Dernier message: 07/01/2005, 15h31

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