Salut !
Tout le monde connaît les «*warning*» du type
'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
ou leurs équivalents selon le compilateur.
Je travaille en ce moment sur des types de nombres flottants en grande précision (double double et octuple précision). Bien sur, de la même façon qu'il est possible de «*caster*» un double en float, j'aimerais que ces types soit convertibles en double.
Le problème c'est que j'aimerais interdire la conversion implicite. Autrement dit qu'il soit impossible d'écrire, par exemple
mais seulement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 dd_real x = math::numerical_constants<dd_real>::pi(); double y = x;
ou a la limite
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 dd_real x = math::numerical_constants<dd_real>::pi(); double y = static_cast<double>(x);
Évidemment, mon opérateur de cast est codé dans la classe dd_real :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 dd_real x = math::numerical_constants<dd_real>::pi(); double y = (double)x;
Un tel opérateur autorise le cast implicite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class dd_real { // ... operator double () { // implementation } // ... };
Dans le cas ou le cast est implémenté dans la classe vers laquelle on convertit, le mot clefpeut être utilisé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part explicit
Comment empêcher la conversion implicite vers double ?
Je me doute qu'une façon de faire serait de définir une méthode "to_double" par exemple. Le problème c'est qu'on utilise ce type comme paramètre template de pas mal de code :
-des templates à nous
-des templates de la stl ou de boost
Ces classes templates , par exemple la classe "floating_point_classification" de boost fait des conversions vers double par static_cast (et évidemment pas une méthode "to_double") avant d'appeler la méthode qui va bien sur double (typiquement pour le isnan). C'est ausi le cas dans l'implémentation de std::complex de visual c++ .
Pour le moment, je résouds le problème salement en spécialisant des templates de boost ou de la stl pour le type qui m'intéresse !
Je veux un mot clef explicit pour les opérateurs de cast !
Quelqu'un a-t-il une méthode pour contourner la difficulté ?
Partager