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

C++ Discussion :

classe de trait


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut classe de trait
    Bonjour à tous!

    J'aurai voulu faire une petite classe de trait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename T> 
    struct isRGB
    {
    	static const bool value = false;
    };
     
    template<>
    struct isRGB<vigra::RGBValue<vigra::UInt16> >
    {
    	static const bool value = true;
    };
    Sauf que à la place de vigra::UInt16, j'aurai bien mis un autre template pour que ça marche correctement, et donc couvrir tous les cas RGB (int, float etc...)

    Un genre de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<>
    template<U>
    struct isRGB<vigra::RGBValue<U> >
    {
    	static const bool value = true;
    };
    Est-ce possible ?

    Merci !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ceci fonctionnera très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    struct isRGB<vigra::RGBValue<T> >
    {
    	static const bool value = true;
    };
    En fait une spécialisation peut très bien avoir autant de paramètres templates que la version générique, voire même plus. L'important étant qu'elle soit plus spécialisée au niveau du type générique de base.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Effectivement ! Tout simplement!
    Je ne suis pas encore arrivé au bout de mes peines, mon programme ne fonctionne toujours pas !

    Un peu plus d'explication: Depuis logntemps, je traine des template pour pouvoir appliquer les même traitements à une image RGB qu'à une image en niveau de gris...
    A un moment, j'ai besoin de faire un tri dans un vector, et forcément l'opérateur < n'est pas défini pour un RGBValue (ça veut pas dire grand chose).
    M'enfin, ça m'arrangerait bien quand même de comparer, alors je le fais moi même sur la base de la luminance...

    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
    template <typename T>
    struct TriRGBCroissant
    {
    	bool operator ()(const vigra::RGBValue<T>& a1, const vigra::RGBValue<T>& a2) const 
       { 
          return (a1.luminance() < a2.luminance() ); 
       } 
    };
     
     
    template <typename T>
     T inspectVoisinage(typename vigra::BasicImage<T>::traverser & A, typename vigra::BasicImage<T>::traverser  & B, T val)
    {
    	std::vector<T> vect;
     
    	vigra::BasicImage<T>::traverser iter_x = A;
    	for (; iter_x.x != B.x ; ++iter_x.x) {
    		vigra::BasicImage<T>::traverser iter_y = iter_x;
    		for (; iter_y.y != B.y ; ++iter_y.y) {
    			if (*iter_y != val) {
    				vect.push_back(*iter_y);
    			}
    		}
    	}
    	if (vect.empty() )
    		return 0;
    	else
    	{
    		if (isRGB<T>::value) {
    			std::sort(vect.begin(), vect.end(), TriRGBCroissant<T>() );// Cas RGB
    		}
    		else {
    			std::sort(vect.begin(), vect.end(), typename std::greater<T>() ); // Cas NORMAL
    		}
    	}
    	return vect[static_cast<int>(vect.size()*0.5)];
    }
    Le compilo n'aime pas trop mon code (c'est la mode en ce moment ),

    d:\analyse v2.02\analyse\Warping.h(31) : error C2784: 'bool vigra::operator <(vigra::FixedPoint<IntBits1,FracBits1>,vigra::FixedPoint<IntBits2,FracBits2>)' : impossible de déduire l'argument modèle pour 'vigra::FixedPoint<IntBits1,FracBits1>' à partir de 'vigra::RGBValue<VALUETYPE>'
    with
    [
    VALUETYPE=vigra::UInt16
    ]
    d:\vigra 1.5\include\vigra\fixedpoint.hxx(514) : voir la déclaration de 'vigra::operator <'
    d:\analyse v2.02\analyse\Warping.h(30) : lors de la compilation de la fonction membre '<Inconnu>' de la classe <Inconnu>
    d:\analyse v2.02\analyse\Warping.h(55) : voir la référence à l'instanciation de la classe modèle 'TriRGBCroissant<T>' en cours de compilation
    with
    [
    T=vigra::RGBValue<vigra::UInt16>
    ]
    d:\analyse v2.02\analyse\Warping.h(80) : voir la référence à l'instanciation de la fonction modèle 'T inspectVoisinage<T>(vigra::BasicImageIterator<PIXELTYPE,ITERATOR> &,vigra::BasicImageIterator<PIXELTYPE,ITERATOR> &,T)' en cours de compilation
    with
    [
    T=vigra::RGBValue<vigra::UInt16>,
    PIXELTYPE=vigra::RGBValue<vigra::UInt16>,
    ITERATOR=vigra::RGBValue<vigra::UInt16> **

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est parce que tu essayes de différencier à l'exécution (avec ton if) ce qui doit l'être à la compilation. Ici les deux membres du if/else seront compilés, en l'occurence TriCroissant pour des types qui ne sont pas RGB, et std::greater pour des types qui le sont ; d'où les erreurs.

    Il faut que le choix se fasse à la compilation, par exemple comme ça :
    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
    template <typename T>
    struct Tri
    {
        bool operator()(const T& t1, const T& t2)
        {
            return t1 < t2;
        }
    };
     
    template <typename T>
    struct Tri<vigra::RGBValue<T> >
    {
        bool operator()(const vigra::RGBValue<T>& t1, const vigra::RGBValue<T>& t2)
        {
            return t1.luminance() < t2.luminance();
        }
    };
     
    std::sort(vect.begin(), vect.end(), Tri<T>() );

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Je me doutais bien qu'il y avait un truc qui clochait... Il fallait le faire à la compilation. Avec le recul, c'est évident maintenant, mais bon...

    Merci beaucoup beaucoup Laurent !

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

Discussions similaires

  1. Classe comparable, traits
    Par Awakening dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2012, 09h27
  2. Class de traits ou préprocessor ?
    Par jblecanard dans le forum C++
    Réponses: 7
    Dernier message: 03/01/2011, 11h08
  3. Réponses: 2
    Dernier message: 26/11/2010, 00h10
  4. Probleme avec une class qui traite la date
    Par tarikmahf dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 10/11/2008, 22h12
  5. classe de traits et conteneurs
    Par koopajah dans le forum C++
    Réponses: 6
    Dernier message: 02/02/2005, 10h58

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