std:: any_cast
From cppreference.net
|
Défini dans l'en-tête
<any>
|
||
|
template
<
class
T
>
T any_cast ( const any & operand ) ; |
(1) | (depuis C++17) |
|
template
<
class
T
>
T any_cast ( any & operand ) ; |
(2) | (depuis C++17) |
|
template
<
class
T
>
T any_cast ( any && operand ) ; |
(3) | (depuis C++17) |
|
template
<
class
T
>
const T * any_cast ( const any * operand ) noexcept ; |
(4) | (depuis C++17) |
|
template
<
class
T
>
T * any_cast ( any * operand ) noexcept ; |
(5) | (depuis C++17) |
Effectue un accès sécurisé au type de l'objet contenu.
Soit
U
le type
std::
remove_cv_t
<
std::
remove_reference_t
<
T
>>
.
Table des matières |
Paramètres
| opérande | - |
cible
any
objet
|
Valeur de retour
1,2)
Retourne
static_cast
<
T
>
(
*
std
::
any_cast
<
U
>
(
&
operand
)
)
.
3)
Retourne
static_cast
<
T
>
(
std
::
move
(
*
std
::
any_cast
<
U
>
(
&
operand
)
)
)
.
4,5)
Si
operand
n'est pas un pointeur nul, et que le
typeid
du
T
demandé correspond à celui du contenu de
operand
, un pointeur vers la valeur contenue dans l'opérande, sinon un pointeur nul.
Exceptions
1-3)
Lance
std::bad_any_cast
si le
typeid
du
T
demandé ne correspond pas à celui du contenu de
operand
.
Exemple
Exécuter ce code
#include <any> #include <iostream> #include <string> #include <type_traits> #include <utility> int main() { // Exemple simple auto a1 = std::any(12); std::cout << "1) a1 est int: " << std::any_cast<int>(a1) << '\n'; try { auto s = std::any_cast<std::string>(a1); // lève une exception } catch (const std::bad_any_cast& e) { std::cout << "2) " << e.what() << '\n'; } // Exemple avec pointeur if (int* i = std::any_cast<int>(&a1)) std::cout << "3) a1 est int: " << *i << '\n'; else if (std::string* s = std::any_cast<std::string>(&a1)) std::cout << "3) a1 est std::string: " << *s << '\n'; else std::cout << "3) a1 est d'un autre type ou non défini\n"; // Exemple avancé a1 = std::string("hello"); auto& ra = std::any_cast<std::string&>(a1); // référence ra[1] = 'o'; std::cout << "4) a1 est string: " << std::any_cast<const std::string&>(a1) << '\n'; // référence constante auto s1 = std::any_cast<std::string&&>(std::move(a1)); // référence rvalue // Note : « s1 » est un std::string construit par déplacement static_assert(std::is_same_v<decltype(s1), std::string>); // Note : le std::string dans « a1 » reste dans un état valide mais non spécifié std::cout << "5) a1.size(): " << std::any_cast<std::string>(&a1)->size() // pointeur << '\n' << "6) s1: " << s1 << '\n'; }
Sortie possible :
1) a1 est int: 12 2) bad any_cast 3) a1 est int: 12 4) a1 est string: hollo 5) a1.size(): 0 6) s1: hollo
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 3305 | C++17 |
le comportement des surcharges
(
4,5
)
était ambigu si
T
est
void
|
le programme est mal formé dans ce cas |