Hello !
"Design pattern" n'est pas tout à fait adapté dans notre cas, les design pattern étant des structures connues et répandues visant à répondre à un problème de programmation courant. Ton cas ne fait pas vraiment partie des cas courants... mais bon cela est un détail, passons aux choses sérieuses.
Une petite mise au point : operator= n'est pas un opérateur de conversion mais un opérateur d'affectation. Un opérateur de conversion prend la forme de
1 2 3 4
| operator type_cible () const {
// Implémentation
return result;
} |
Et il s'utilise sous la forme :
type_cible var2 = type_cible(var1);
Voici un exemple (en C++11 mais les parties intéressantes sont valables en C++03).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <cstdint>
namespace taf {
class nombre final {
uint8_t value_ = 0;
public:
nombre(uint8_t value) : value_(value) {}
nombre(nombre const &) = default;
nombre(nombre &&) = default;
~nombre() {}
operator double () const { return static_cast<double>(value_); }
};
} // namespace taf |
Si tu écris :
1 2 3 4 5 6
| int main() {
taf::nombre nb1(3);
uint32_t nb2 = 5;
double result = nb2 + nb1;
return 0;
} |
Tu vas en effet obtenir un ambiguous overload for ‘operator+’ (operand types are ‘uint32_t {aka unsigned int}’ and ‘taf::nombre’).
Tu peux du coup écrire:
1 2 3 4 5 6
| int main() {
taf::nombre nb1(3);
uint32_t nb2 = 5;
double result = nb2 + double(nb1);
return 0;
} |
Et là le code fonctionnera.
Mon conseil est donc:
- Virer les constructeurs par copie, sauf d'un type dans lui-même et la copie depuis les types builtin.
- Virer les opérateurs d'affectation, sauf d'un type à lui même et l'affectation depuis les types builtin.
- Fournir sur chaque type les opérateurs de conversion vers les autres en n'oubliant pas la constness.
Idéalement, il faudrait aussi mettre en explicit les conversions rares et/ou qui font perdre de la précision. Tu peux aussi tout mettre en explicit, à toi de jauger en fonction du contexte.
Cette opération peut éventuellement casser ta compile dans un premier temps mais elle te permettra de lever aisément toutes les ambiguités. Je suppose que tu es au fait de toutes les pertes de précision que ces conversions peuvent engendrer, je ne fais donc pas de diatribe sur ce point.
Partager