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 :

template class : transtyping


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut template class : transtyping
    Bonjour tout le monde,
    j'ai une classe template my_int qui comme son nom ne l'indique pas peut etre instancier my_int<double> ou my_int<float>,
    je voudrais faire un constructeur du type, a partir d'un my_int<double> me construit un my_int<float> mais je n'arrive pas à trouver la bonne syntaxe.
    Voici mon fichier .h :
    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
    template<typename T>
     
     
    class my_int
    {
    	public : 
    	my_int(const T value_);
    	template<typename U>
    	my_int(const U value_);
    	template<typename U>
    	my_int(const my_int<U> other_int);
    	void add(const my_int<T> other_int);
    	void multi(const my_double<T> d);
    	T get();
     
    	void operator= (const my_double<T> d);
     
    	private :
    	T value;
    	static const char * class_name;
    	static const char * class_name1;
     
    	//friend void my_double<T>::add(const my_int<T> other_int);
    	friend void mult<>(my_double<T> &,const my_int<T> &,const my_double<T>&);
     
    };
     
    #include "my_int.hpp"



    et voici mon fichier hpp :
    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
    #include "my_double.h"
     
    template<typename U> class my_int;
    template<typename T>
    const char * my_int<T>::class_name = "faust_mat<T>::";
    template<typename T>
    const char * my_int<T>::class_name1 = "faust_mat1<T>::";
     
    template<typename T>
    my_int<T>::my_int(const T value_) : value(value_){}
     
     
    template<typename T>
    void my_int<T>::add(const my_int<T>  other_int)
    {
    	value += other_int.value; 
    }
     
    template<typename T>
    T my_int<T>::get()
    {
    	return value;
    }
    template<typename U>
    template<typename T>
    my_int<T>::my_int(const my_int<U> other_int) : value((U) value_){};
     
     
     
    template<typename U>
    template<typename T>
    my_int<T>::my_int(const U value_) : value((T) value_){}
     
     
    template<typename T>
    void my_int<T>::multi(const my_double<T> d)
    {
    	value *= d.value; 
    }
     
    template<typename T>
    void my_int<T>::operator= (const my_double<T> d)
    {
    	value = d.value;
    }

    Merci d'avance

  2. #2
    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
    Salut,

    à priori je dirais que cette syntaxe est bonne template<typename U> my_int(const my_int<U>& other_int);. Peut-être voudrais-tu aussi fournir des opérateurs de conversions operator double(); etc.
    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.

  3. #3
    Invité
    Invité(e)
    Par défaut
    quelque chose comme çà ?

    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
    template<typename T>
    class my_int
    {
        public : 
            my_int(const T value_) : value(value_) {}
     
            template<typename U> 
            my_int(const my_int<U> & other_int) : value(other_int.get()) {}
     
            T get() const { return value; }
     
        private :
            T value;
    };
     
    int main()
    {
        my_int<double> d(42.0);
        my_int<float> f(d);
        return 0;
    }

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Juste une question en passant, ce serait pourquoi faire?
    Parce que dans l'état, tu peux initialiser my_int<T> avec un my_int<U> uniquement s'il existe un cast possible entre T et U, ce qui signifie que tu pourrais tout aussi bien utiliser directement T et U, tu n'as donc rien gagné en terme de transtypage ou je me trompe?

    Tu peux regarder quelques éléments sur la question dans https://akrzemi1.wordpress.com/2013/...rasure-part-i/
    Le type est un ponte, et il avoue n'avoir pas de solution parfaite

  5. #5
    Candidat au Club
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Pour répondre à stendhal666,
    c'est pour faire du calcul matriciel, j'ai des matrices en simple(float) et en double precision (double),
    j'ai des operations que je suis obligé de faire en double precision et d'autre qui peuvent etre fait en
    simple precision (qui sont donc plus rapide) et je voudrais juste faire un constructeur
    (1) mat<T>::mat(const mat<U> mat) ainsi que l'operateur d'affectation (2) void faust_mat<T>::operator=(faust_mat<U> const& A).
    Merci à groharpon42, c'était bien ce qui fallait écrire!

Discussions similaires

  1. Réponses: 19
    Dernier message: 23/12/2009, 19h22
  2. Réponses: 3
    Dernier message: 09/04/2009, 11h30
  3. Template / Classe Latex
    Par zifox dans le forum Débuter
    Réponses: 3
    Dernier message: 26/03/2009, 18h04
  4. template<class> et template<typename>
    Par mister3957 dans le forum C++
    Réponses: 10
    Dernier message: 01/11/2007, 09h32
  5. Héritage classe template->classe template
    Par zabibof dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2007, 11h05

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