vendredi 31 juillet 2020

C++ 17 - De la magie avec std::visit et if constexpr

Le if constepr, voilà une fonctionnalité qu'elle est intéressante ! Elle permet en effet d'évaluer des conditions durant la phase de compilation, mais mieux, elle permet d'éviter la compilation des autres branches et donc du code qui sinon pourrait de pas compiler. C'est pas clair ? Voyons un exemple. Imaginons une fonction "increment" qui puisse prendre n'importe quel type numérique et l'incrémenter. On veut aussi que cela marche avec une chaîne, et dans ce cas il faut transformer la chaîne en entier, l'incrémenter, puis en refaire une chaîne. Bien sûr, la meilleure manière de faire est d'avoir une fonction template pour le cas général et une fonction prenant une std::string pour ce cas particulier, mais voyons quand même ce que cela donne.

En particulier, il est évident que ce code ne compile pas. En effet, inc(5) va provoquer une erreur de compilation dans la branche où on appelle std::stoi sur l'entier, et inc(std::string(8)) va provoquer une erreur dans la branche où on l'incrémente de 1.

#include <type_traits>
#include <string>
#include <iostream>

template<typename T>
T inc(T value)
{
  if(std::is_same_v<T, std::string>)
  {
    return std::to_string(std::stoi(value) + 1);
  }
  else
  {
    return value + 1;
  }
}

int main()
{
  std::cout << inc(5) << std::endl;
  std::cout << inc(std::string("8")) << std::endl;
  
  return 0;
}

Mais miracle, si l'on remplace notre if par un if constepr...

template<typename T>
T inc(T value)
{
  if constexpr(std::is_same_v<T, std::string>)
  {
    return std::to_string(std::stoi(value) + 1);
  }
  else
  {
    return value + 1;
  }
}

Alors ça compile gentiment ! À la compilation, la condition est évaluée, et le code non pertinent est simplement éliminé. Génial, non ?

Voici un exemple un peu plus utile. Nous avons un variant, et voulons en extraire n'importe quelle valeur arithmétique en la convertissant vers un double. Avec std::visit et if constexpr, c'est plutôt simple. Dans notre visiteur, nous pouvons directement vérifier si le type est arithmétique à l'aide d'un constexpr (sur le type decay, pour enlever les modificateurs constant et référence), et l'on peut ensuite utiliser directement le type. Sans le if constexpr, il aurait fallu créer une série de fonctions avec des std::enable_if de partout. C'est donc beaucoup, beaucoup mieux. Les if constexpr, c'est bon, mangez-en.

#include <type_traits>
#include <string>
#include <iostream>
#include <variant>

using VariantT = std::variant<std::string, int, double, unsigned short>;

bool getArithmeticValue(const VariantT & variant, double & value)
{
  return std::visit
    ([&value](auto && arg)
     {
       using T = std::decay_t<decltype(arg)>;
       if constexpr(std::is_arithmetic_v<T>)
       {
         value = static_cast<double>(arg);
         return true;
       }
       else
       {
         return false;
       }
     },
     variant);
}

int main()
{
  VariantT v1(std::string("abc"));
  VariantT v2(int(5));
  VariantT v3(double(2.3));

  double v = 0;
  std::cout << getArithmeticValue(v1, v) << std::endl;
  std::cout << getArithmeticValue(v2, v) << std::endl;
  std::cout << v << std::endl;
  std::cout << getArithmeticValue(v3, v) << std::endl;
  std::cout << v << std::endl;
  
  return 0;
}

samedi 25 juillet 2020

Minons les astéroïdes

Et on va dire que ça va aller ! Voici le rendu final de mon vaisseau spatial. J'ai rajouté une antenne, une rambarde, et basta !

jeudi 23 juillet 2020

X-plane 1.50 et A350 1.6 - Gros Beta !

Enfin, la Beta X-plane 1.50 fonctionne ! Et elle fonctionne même rudement bien. J'avais fini par comprendre que ce qui tuait les perfs, c'était la combinaison des nuages et de l'antialiasing. Donc j'avais le choix entre voler par ciel bleu, ou voir tous les pixels sur les bords de mon tableau du même nom. Et là, avec la 1.50 Beta, enfin, je peux combiner les deux, et atteindre entre 0 et 60 images par seconde avec l'antialias X8. Et qu'en plus, on a même pas besoin de redémarrer pour l'enclencher. Bonheur.

Alors, ce n'est pas encore parfait, et il y a quelques plantages et autres bugs d'affichage. Les avions tiers qui n'ont pas encore été mis à jour n'arrivent pas à afficher les écrans popup correctement. Mais ça va venir, et c'est extrêmement encourageant.

Toujours dans la série des Beta, j'ai mis à jour l'A350 de Flight Factor, et c'est la joie ! Enfin, des SID, des STAR, la gestion de la consommation de kérosène, le top of descent... Youpie ! Pour fêter ça, je me suis fait mon petit Orly / Toulouse habituel, mais il m'a fallu aller au plumard avant d'avoir eu le temps d'arriver. Mais ce n'est que partie remise. Transatlantiques, nous voilà !

mardi 14 juillet 2020

X-Plane - Quelques courses

Parce qu'il fallait bien profiter des soldes, je me suis lâché, et j'ai ajouté deux avions dans le hangar. Tout d'abord, le déjà classique A321 de Toliss, avec lequel je compte bien faire quelques procédures de panne moteur et autres joyeusetés (voir à ce sujet les excellents tutos de FalconEye), mais également du trans-atlantique: la variante LR de l'A321 peut faire jusqu'à 4000 nautiques, alors qu'un Paris New-York est légèrement au dessus des 3000 nautiques. Pour Los Angeles et pour Pékin, ce sera un peu plus tendu. Mais n'ayez crainte ! Flight Factor va sortir la mise à jour de son A350 sous peu.

Mais revenons à nos agneaux. Je tiens donc dans mes petites mains potelées l'Eclipse 550 NG, modélisé par Aerobask. C'est une très belle bête, qui se pilote gentiment, et qui a une avionique tout à fait intéressante en la personne du Garmin GTN 750, écran tactile, les plans de vol en deux coups de cuillère à pot, sympa. Histoire de coller à l'histoire et d'accompagner notre ex-Premier ministre, j'ai fait un petit vol depuis Le Bourget jusqu'à l'aéroport du Havre.

Voici donc la bête, en extérieur et en intérieur. Je sense que cet avion va remplacer le Cirrus Vision SF50 dans mon cœur pour les petits vols sans prétentions !

Manche et manette Airbus - Ils l'ont fait !

Contre toute attente (en tous cas la mienne !), Thrustmaster a sorti une réplique du manche et de la manette des gaz de l'Airbus A320. Apparemment, ça vient juste de sortir, c'est plutôt cool, et plutôt bien reçu par la communauté. Les revues du manche sur Youtube sont bonnes. La manette des gaz, ce n'est pas encore pour tout de suite car juste en précommande, mais elle est belle comme tout. L'ensemble semble viser le milieu de gamme et les simuleux faisant beaucoup de liner.

C'est intéressant de voir que ce genre de matos voit le jour maintenant. Je suppose que la venue très prochaine de Flight Simulator 2020 n'y est pas pour rien ! Ce n'est probablement pas suffisant pour me faire lâcher mon Warthog Hotas, qui ne joue pas dans la même gamme, mais c'est hyper tentant.

vendredi 3 juillet 2020

Minage d'astéroïdes

Mon vaisseau spatial de classe VERMINE, pour VÉhicule de Reconnaissance et MINage dans l'Espace, commence à prendre forme. Je me suis inspiré de bateaux cargos, et j'ai tenté d'ajouter une touche suffisamment spatiale à la chose, avec des gros moteurs fluo, et des antennes sur le toit. Le tout est beaucoup trop propre : je vais devoir travailler pour donner un aspect buriné à la chose.

Je me suis complètement lâché sur le "glare" (l'éblouissement ?), avec le bleu des moteurs et le blanc du reflet du soleil sur la coque qui provoquent de grands halos de lumière. Mais on est épique ou on ne l'est pas.