Partage
  • Partager sur Facebook
  • Partager sur Twitter

Operateur pour tout tye de nombre

Sujet résolu
    25 juin 2019 à 12:39:30

    Bonjour. Je veux surcharger l'opérateur * pour une classe:

    -si l'objet est un nombre (int,float,double...), ce sera toujours la même procédure

    -si l'objet n'est pas un nombre, c'est du cas par cas

    Mais je ne veux pas définir l'operateur* pour les int puis pour les floats,...: c'est toujours la même chose. 

    Je n'utilise pas de template car il y a des types pour lesquels l'operateur* a un sens différent. Comment dois-je m'y prendre?

    • Partager sur Facebook
    • Partager sur Twitter
    Le basheur
      25 juin 2019 à 13:09:48

      BelhouariSéhane a écrit:

      Bonjour. Je veux surcharger l'opérateur * pour une classe:

      -si l'objet est un nombre (int,float,double...), ce sera toujours la même procédure

      -si l'objet n'est pas un nombre, c'est du cas par cas

      Mais je ne veux pas définir l'operateur* pour les int puis pour les floats,...: c'est toujours la même chose. 

      Je n'utilise pas de template car il y a des types pour lesquels l'operateur* a un sens différent. Comment dois-je m'y prendre?



      Tu peux utiliser les templates et la spécialisation de template pour les "cas par cas".

      A+

      -
      Edité par Didy7 25 juin 2019 à 13:14:24

      • Partager sur Facebook
      • Partager sur Twitter
        25 juin 2019 à 14:19:46

        Salut,

        Je voulais écrire un exemple simple pour t'aider, parce qu'il me semblait qu'il y avait un petit piège. En effet, tu ne peux pas spécialisé partiellement un template sur une fonction, mais sur une classe oui. J'ai fait un truc comme ça si tu veux voir comment faire de la spécialisation partielle.

        Mais en fait je me suis dis que tu ne devais sûrement pas avoir de comportement par défaut, donc un assert est plus approprié, j'opterais plus pour une solution comme ça :

        #include <iostream>
        #include <string>
        #include <type_traits>
        
        template< typename Type >
        void print(const Type & val)
        {
            static_assert(std::is_arithmetic<Type>::value, "print should work with arithmetics value");
            std::cout << val << " is a number" << std::endl;
        }
        
        struct People {
            std::string name;
            std::string surname;
        };
        
        template<> void print<People>(const People & val)
        {
            std::cout << "My name is " << val.name << " " << val.surname << std::endl;
        }
        
        int main()
        {
            print(People{"Jean", "Dupond"});
            print(3);
            print(3.14);
            //print("Hello"); <- generate a compile error because of static_assert, this is not an acceptable type
            
            return 0;
        }
        


        PS : par contre je sais pas si on peut surcharger l'opérateur * sur un primitif

        -
        Edité par romantik 25 juin 2019 à 14:36:25

        • Partager sur Facebook
        • Partager sur Twitter
        Dream on, Dream on, Dream until your dream comes true
          25 juin 2019 à 21:15:40

          Merci, ça marche parfaitement!
          • Partager sur Facebook
          • Partager sur Twitter
          Le basheur

          Operateur pour tout tye de nombre

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown