Si tu récupères un type "en cascade", tout ce que tu fais est simplement de changer float en double "globalement".
Non, un arbre ça n'est pas un fil.
Si il a une méthode PreciseCalculator::calculate prenant un PreciseCalculator::float_type, il n'y a que les fonctions qui utilisent ce calculate() qui utiliseront ce type. Sachant que ces fonctions peuvent très bien de leur coté redéfinir un typedef si jamais leur type doit être indépendant de PreciseCalculator::float_type.
les autres méthodes, comme FastCalculator::calculate() peuvent continuer à utiliser des floats si elle n'utilisent pas PreciseCalculator. Et si UberFastCalculator est trop lent avec des floats, alors il peut utiliser des FixedPoint à la place, sans impacter FastCalculator.
Mais ça, ça n'est que pour les typedef. Supposons que l'on soit intelligent, et que l'on définisse Calculator<FloatType> à la place. Les fonctions appelantes devront choisir quel Calculator utiliser. Et le plus simple pour ça, c'est encore de définir un typedef Calculator<FixedPoint> calculator_type;
La fonction appelante n'aura ensuite qu'a utiliser des 'typename calculator_type::float_type' (c'est trop long comme nom ? utilise un typedef ;) ) et elle pourra changer d'implémentation comme elle le veut, ses types seront mis à jour automatiquement. Elle pourra aussi exporter ces types vers les fonctions appelantes de la fonction appelante, ect .... sans impacter des fonctions qui n'ont rien à voir et qui utilisent Calculator<double>.
[^] # Re: C++ est vieux
Posté par Batchyx . En réponse au journal C++ a été créé pour augmenter le salaire des programmeurs. Évalué à 1.
Non, un arbre ça n'est pas un fil.
Si il a une méthode PreciseCalculator::calculate prenant un PreciseCalculator::float_type, il n'y a que les fonctions qui utilisent ce calculate() qui utiliseront ce type. Sachant que ces fonctions peuvent très bien de leur coté redéfinir un typedef si jamais leur type doit être indépendant de PreciseCalculator::float_type.
les autres méthodes, comme FastCalculator::calculate() peuvent continuer à utiliser des floats si elle n'utilisent pas PreciseCalculator. Et si UberFastCalculator est trop lent avec des floats, alors il peut utiliser des FixedPoint à la place, sans impacter FastCalculator.
Mais ça, ça n'est que pour les typedef. Supposons que l'on soit intelligent, et que l'on définisse Calculator<FloatType> à la place. Les fonctions appelantes devront choisir quel Calculator utiliser. Et le plus simple pour ça, c'est encore de définir un typedef Calculator<FixedPoint> calculator_type;
La fonction appelante n'aura ensuite qu'a utiliser des 'typename calculator_type::float_type' (c'est trop long comme nom ? utilise un typedef ;) ) et elle pourra changer d'implémentation comme elle le veut, ses types seront mis à jour automatiquement. Elle pourra aussi exporter ces types vers les fonctions appelantes de la fonction appelante, ect .... sans impacter des fonctions qui n'ont rien à voir et qui utilisent Calculator<double>.