OVH Cloud OVH Cloud

template et cast

1 réponse
Avatar
Benoit Rousseau
Bonjour,

Je vous avez déjà parlé de mes string->template.
J'ai donc un type Value, dont dérive chaque type.
Pour aller vite (et "bien" je pense), j'avais créer un type

template <class T>
class Basetype : public Value {
Basetype( const T& v ) : value( v ) {}
Basetype( ) {}
T value;
};

Deux choses :
* Je voudrais faire des conversions de Basetype<int> vers
Basetype<double> par exemple. Comment est ce que vous me conseillez de
m'y prendre ? Et peut être même d'une Value à une autre, mais ce serait
pour plus tard.

* Je voudrais (dans la succession du premier cas) avoir des opérateurs
du genre Value+Value, les deux Values pouvant entre de type différent.
Je compte me baser sur les opérateurs qui existe déjà :
Basetype<int>+Basetype<double> (retourne un Basetype<double> ?) ou
Basetype<double>*Basetype<Vector2D> (operation scalaire, Vector2D etant
une classe du programme).

Est ce qu'il y a un moyen (simple) de faire des conversions (implicites)
avec ces templates ?



Enfin, (et on revient sur une discussion de cette semaine sur les
membres statics) j'aurais voulu stocker pour chacun de ses types une
string static. Et enregistrer en même temps dans une map...

J'avais pensé à Basetype<double>::init( "double" ) pour faire les deux
d'un seul coup :
static void Basetype::init( const std::string& s ) {
type_name = s;
creators[s] = &create; // static void Basetype::create() ...
}

Mais ca marche pas : type_name n'est pas instanciée. Il faut que je me
tape "string Basetype<...> ;" pour chaque type ? (redondance à mon gout)

Merci.

--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

1 réponse

Avatar
Thierry Miceli
* Je voudrais faire des conversions de Basetype<int> vers
Basetype<double> par exemple. Comment est ce que vous me conseillez de
m'y prendre ? Et peut être même d'une Value à une autre, mais ce serait
pour plus tard.


Ajoute le membre suivant à Basetype:
template <class U> operator U() { return value; }

Tu pourras écrire alors:
Basetype<int> a;
Basetype<double> b;
b = a;

Toutes les conversions d'un Basetype<typeA> vers Basetype<typeB> sont ainsi
possibles à condition qu'il y ait déjà des conversion de type implicites de
typeA vers typeB.

Thierry