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 :

Redefinir tous les operateurs d'un numerique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    Par défaut Redefinir tous les operateurs d'un numerique
    Bonjour à tous,

    J'aurais eu besoin d'écrire un template MonTemplate<T> ,avec T étant un numérique (int, float, double, etc.).
    Je veux en fait pouvoir faire une action lorsque la valeur interne de T change. Pour l'instant, j'utilise des Set()/Get() sur le template pour mettre à jour et obtenir T.

    Je souhaiterais pouvoir manipuler MonTemplate<T> dans des opérations mathématiques comme s'il s'agissait de T, en ne me servant plus des Set()/Get(). Néanmoins, il faut j'imagine re-écrire tous les opérateurs : c'est rébarbatif, j'ai peur d'en oublier, et de passer à côté d'effets de bord.

    Comment feriez-vous ?

    Pour l'instant :
    MonTemplate<int> Toto;
    MonTemplate<int> Titi;

    Toto.Set(12*Titi.Get()); // La valeur interne change et je fais des traitements particuliers.

    Je voudrais arriver à ça :
    Toto = 12*Titi; // La valeur interne change et je fais des traitements particuliers.
    int tutu = Toto + 7;

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Et pourquoi pas un opérateur de conversion implicite en T ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Remplacer Set() par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T & operator=(const T & r)
    {
    //ton code d'assignation
    return *this;
    }
    Remplacer Get() par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    operator T()
    {
    return ...;//ton code
    }
    Quoique pour ce dernier, il faut voir ce que tu veux faire plus précisement.

    Plus généralement
    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
    T & operator++()
    { //ton code ++;
     return *this; }
    T operator++(int)
    { T tmp(*this);
     //ton code ++;
     return tmp; }
    T & operator+=(const T & r)
    { //ton code +=;
     return *this; }
    T & operator-=(const T & r)
     { //ton code -=;
     return *this; }
    T operator+(const T & r) const
    { T tmp(*this);
     return (tmp += r); }
    T operator-(const T & r) const
    { T tmp = *this;
     return (tmp -= r); }
    Etc... Enfin à peu près il me semble.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 11
    Par défaut
    Bon, je voulais limiter le nombre de redéfinissions d'opérateurs. Je craignais devoir en faire plus.

    Voici ce que j'ai fait :

    Merci !

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    template <typename T> class AutomaticParam : public ListenerManager, public APIdManagement
    {
    private:
    	T	m_Data;
    public:
    	inline T & operator=(const T & Right)
    	{
    		if(m_Data != Right)
    		{
    			m_Data = Right;
    			this->SendEvent(666, (void*)m_Id);
    		}
    		else
    		{
    			m_Data = Right;
    		}
    		return m_Data;
    	}
    	inline operator T()
    	{
    		return m_Data;
    	}
    	inline T operator++(int)
    	{
    		T Ans = m_Data;
    		++m_Data;
    		return Ans;
    	}
    	inline T operator--(int)
    	{
    		T Ans = m_Data;
    		--m_Data;
    		return Ans;
    	}
    	inline T & operator++()
    	{
    		 return (++m_Data); 
    	}
    	inline T & operator--()
    	{
    		 return (--m_Data); 
    	}
    	inline T & operator+=(const T & Right)
    	{
    		m_Data+=Right;
    		return m_Data; 
    	}
    	inline T & operator-=(const T & Right)
    	{
    		m_Data-=Right;
    		return m_Data; 
    	}
     
    	static bool Test(void)
    	{
    		AutomaticParam<int> Toto;
    		Toto = 12;
    		Toto = 13.0;
    		Toto += 12;
    		int tutu = Toto;
    		tutu = Toto - 1;
    		tutu = 2+ Toto;
    		tutu = Toto++;
    		tutu = --Toto;
    		tutu = Toto*2.0;
     
    		return true;
    	}
    };

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. redefinir les operateurs ?
    Par kespy13 dans le forum Langage
    Réponses: 2
    Dernier message: 10/05/2008, 22h01
  3. [C#] Décrémenter tous les numerique d'un string
    Par frechy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/03/2006, 20h20
  4. Réponses: 4
    Dernier message: 16/08/2003, 13h21
  5. Enlever tous les M&Mme des enregistrements
    Par marc olivier dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/07/2003, 12h24

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