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.
-
É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.
- 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.
- 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;