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 :

peut-on redéfinir le type template pour une même instance ?


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 56
    Points : 38
    Points
    38
    Par défaut peut-on redéfinir le type template pour une même instance ?
    Bonjour,

    Je rencontre un cas ou j'aimerais pouvoir changer le type Template pour une même instance. J'expose un exemple plus parlant:
    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
    template <class result_type>
    struct data
    {
    	result_type dt;
    };
     
    template <class result_type>
    class processing
    {
    	private:
    	data* d_;
     
    	public:
    	processing(data* d);
    	void processing_function(result_type result);
    	processing& operator=(const processing& o) = default;
    };
     
    template<class result_type>
    inline processing<result_type>::processing(data * d) : d_(d)
    {
    }
     
    // SETTER
    template<class result_type>
    inline void processing<result_type>::processing_function(result_type result)
    {
    	d_->dt = result;
    }
     
    int main(int argc, char* argv[])
    {
     
    	data<int> da;
    	da.dt = 10;
    	processing<int> p(&da);
    	p.processing_function(308);
     
    	/* Peut-on garder les données de l'instance tout en modifiant le type template ? */
    	p.processing_function("test");
     
    	return 0;
    }
    Merci d'avance pour vos suggestions ou vos modifications de code.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Malheureusement, les paramètres template (ce qui remplace <class result_type> pour ta classe Data, par exemple) sont évalués à la compilation, ce qui fait que:
    • le compilateur doit connaitre le type qui remplace ce paramètre avant même de pouvoir générer le code binaire correspondant
    • A moins de changer ce type dans le code (de remplacer data<int> da; dans ta fonction principale par data<double> da; par exemple), une fois que ce paramètre est donné, il l'est de manière définitive.

    Ceci dit, il est toujours possible de faire hériter ta classe template d'une classe de base qui ne l'est pas, et, sous réserve de respecter les règles qui permettent de profiter du polymorphisme, d'instancier plusieurs spécialisation de cette classe template et de toutes les utiliser comme s'il s'agissait de la classe de base

    Ainsi, un code proche de
    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
    class Base{
    public:
         Base(Base const &) = delete;
         Base & operator=(Base const &) = delete;
         virtual ~Base() = default;
         virtual void doIt() const = 0;
    };
    template <typename T>
    class Derived : public Base{
    public:
        void doIt() override{
            /* ... */
        }
    };
    void excute(Base const & b){
        b.doIt();
    }
    int main(){
        Derived<int> dInt;
        Derived<double> dDouble;
        execute(dInt);
        execute(dDouble);
        return 0;
    }
    sera tout à fait légal et réagira exactement comme prévu (tu pourrais d'ailleurs envisager l'utilisation du patron de conception visiteur, si le nombre de classes concrètes n'est pas trop important).

    Tu peux également complètement cacher ce genre de hiérarchie au sein d'une classe qui "aura tout" d'une classe non template, excepté son constructeur. Cela te permettrait de faire cohabiter plusieurs types de données ensemble.

    Un exemple classique de cette possibilité est la classe boost::any.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Et en mettant le template ailleurs qu'au niveau de la classe et en utilisant des fonctions de conversion ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/10/2014, 17h46
  2. Deux types pour une même instance
    Par camboui dans le forum C++
    Réponses: 24
    Dernier message: 20/08/2012, 11h40
  3. Réponses: 1
    Dernier message: 29/07/2012, 20h30
  4. Quel moteur de template pour une application web?
    Par denisC dans le forum Frameworks Web
    Réponses: 3
    Dernier message: 14/11/2007, 17h15
  5. [VBA-E]Peut on avoir l'equivalent .controls pour une feuille
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/03/2007, 18h06

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