Class std::ratio, comment ça marche.

Oups ! C'est quoi cette syntaxe ?

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Dans l’objectif d’aider Paul, je me suis refait une classe CRationnel, pour le guider, … avant de tomber par hasard sur la class ratio de la STL. Mais les exemple de cppreference sont incompréhensible pour moi:

#include <iostream>
#include <ratio>
 
int main()
{
    using two_third = std::ratio<2, 3>;
    using one_sixth = std::ratio<1, 6>;
 
    using sum = std::ratio_add<two_third, one_sixth>;
    std::cout << "2/3 + 1/6 = " << sum::num << '/' << sum::den << '\n';
}

Ca sert à quoi ce using ? Ca doit faire référence à ça, mais je ne comprend pas. que veut dire : "adds two ratio objects at compile-time" ? Ce n’est pas une librairie que l’on peu appeler ? Ca ne fonctionne qu’a la compilation ? …

Merci, si vous pouvez m’apporter vos lumières.

Cordialement.

+0 -0

Merci InformaticienZéro,

mais …

Oups! Mais ca sert à quoi de faire une "librairie" qui ne fonctionne qu’avec des constantes et des littéraux ? Parce que si les calcul ne sont fait qu’à la compilation, on ne peut utiliser que des constantes et des littéraux !

Donc dans mon cas:

  • "two_third" et "one_sixth" sont des types, pas des variables ?

  • "std::ratio_add" a besoin de 2 types pour faire l’opération ?

  • et dans ce cas, c’est quoi num et den ? des constantes ?

Je comprends toujours pas à quoi ça peut servir !

Mais déjà un merci pour la réponse rapide.

Merci Yarflam pour ta réponse,

Mais elle semble ne pas être en accord avec ce que j’ai lu sur CPPREFERENCE, et ce que j’en comprends.

Peux-tu m’en dire plus sur la "partie qui s’exécute durant l’exécution du code" ? As-tu un exemple ?

Merci pour ta réponse.

Cordialement.

Tu as raison, je me suis trompé sur toute la ligne concernant cette bibliothèque - mea culpa.

Elle est initialement prévue comme template pour définir des ratios de conversions ; en particulier le système international d’unités :

  typedef ratio<1,       1000000000000000000> atto;
  typedef ratio<1,          1000000000000000> femto;
  typedef ratio<1,             1000000000000> pico;
  typedef ratio<1,                1000000000> nano;
  typedef ratio<1,                   1000000> micro;
  typedef ratio<1,                      1000> milli;
  typedef ratio<1,                       100> centi;
  typedef ratio<1,                        10> deci;
  typedef ratio<                       10, 1> deca;
  typedef ratio<                      100, 1> hecto;
  typedef ratio<                     1000, 1> kilo;
  typedef ratio<                  1000000, 1> mega;
  typedef ratio<               1000000000, 1> giga;
  typedef ratio<            1000000000000, 1> tera;
  typedef ratio<         1000000000000000, 1> peta;
  typedef ratio<      1000000000000000000, 1> exa;

Code source

Ce sont des constantes pré-calculées. :)

std::duration fait du calcul runtime-time en les utilisant.

Avoir le ratio à la compilation permet aussi de vérifier que convertir std::seconds en std::minutes résulte d’une perte de précision et de bloquer cette conversion à la compilation.

Du coup, pour pouvoir calculer un ratio plus facilement et sans coût, il y a plusieurs template pour faire des calculs. Il y a aussi la possibilité d’avoir le ratio minimal pour que std::ratio<2,10>::type soit du type std::ratio<1,5>, ce qui évite d’avoir des types différents pour un ratio identique.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte