Programmation C++

Master M2 Informatique --- Feuille n° 5


L'abrasure, c'est pas dur

Résumé:

Dans ce TD, on crée un type permettant de stocker n'importe quelle valeur, de façon similaire à boost::any.

Exercice n° 1

Écrire une fonction template instanceof de sorte que si A est un type polymorphe et x une variable, instanceof<A>(x) retourne vrai si et seulement si x est d'un sous-type de A.

Exercice n° 2

Comme le schéma ci-dessus l'indique, pour stocker une valeur de type T, un objet de type any est associé à un objet de type untyped_value dont le type réel est en l'occurence Value<T>. La classe untyped_value est une classe abstraite.
  1. Écrire la classe any qui fournit les services suivants:
    • un contructeur prend en argument une valeur de n'importe quel type pour l'encapsuler dans l'objet créé ;
    • un contructeur par copie duplique la valeur encapsulée;
    • l'opérateur d'affectation supporte une valeur de n'importe quel type qui remplace la valeur encapsulée jusqu'à présent; une version spécifique permet d'affecter un objet any à un autre objet any;
    Les seuls composants publics de la classe any seront ceux qui correspondent à ces services, plus, si nécessaire, le destructeur de la classe.
  2. Faire en sorte que le passage d'un objet any dans un flot de sortie provoque l'écriture dans ce flot de la valeur encapsulée.
  3. Soit x un objet de type any et T un type;
    • écrire une fonction template any_typeof de sorte que any_typeof<T>(x) retourne vrai si et seulement si la valeur encapsulée dans x est de type T;
    • écrire une fonction template any_cast de sorte que any_cast<T>(x) retourne la valeur encapsulée dans x si elle est de type T; sinon, cette fonction produit une exception bad_any_cast
  any x(3);
  std::cout << any_typeof<int>(x) << std::endl;
  std::cout << x << std::endl;
  x=12.5;
  double s=any_cast<double>(x);
  std::cout << x << std::endl;
  x=std::string("test");
  std::cout << x << std::endl;