Namespaces
Variants

std::any::any

De fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (déprécié en C++20)
 
 
constexpr any() noexcept;
(1) (depuis C++17)
any( const any& other );
(2) (depuis C++17)
any( any&& other ) noexcept;
(3) (depuis C++17)
template< class ValueType >
any( ValueType&& value );
(4) (depuis C++17)
template< class ValueType, class... Args >
explicit any( std::in_place_type_t<ValueType>, Args&&... args );
(5) (depuis C++17)
template< class ValueType, class U, class... Args >
explicit any( std::in_place_type_t<ValueType>, std::initializer_list<U> il,
              Args&&... args );
(6) (depuis C++17)

Construit un nouvel objet any.

1) Construit un objet vide.
2,3) Copie (2) ou déplace (3) le contenu de other dans une nouvelle instance, de sorte que tout contenu soit équivalent en type et en valeur à celui de other avant l'appel au constructeur, ou vide si other est vide. Formellement,
2) Si other est vide, l'objet construit est vide. Sinon, équivaut à any(std::in_place_type<T>, std::any_cast<const T&>(other)), où T est le type de l'objet contenu dans other.
3) Si other est vide, l'objet construit est vide. Sinon, l'objet construit contient soit l'objet contenu dans other, soit un objet du même type construit à partir de l'objet contenu dans other, en considérant cet objet comme une rvalue.
4) Construit un objet dont le contenu initial est un objet de type std::decay_t<ValueType>, initialisé directement à partir de std::forward<ValueType>(value).
  • Cette surcharge participe à la résolution de surcharge seulement si std::decay_t<ValueType> n'est pas le même type que any ni une spécialisation de std::in_place_type_t, et que std::is_copy_constructible_v<std::decay_t<ValueType>> est true.
5) Construit un objet dont le contenu initial est un objet de type std::decay_t<ValueType>, initialisé directement sans liste à partir de std::forward<Args>(args)....
  • Cette surcharge participe à la résolution de surcharge seulement si std::is_constructible_v<std::decay_t<ValueType>, Args...> et std::is_copy_constructible_v<std::decay_t<ValueType>> sont tous deux true.
6) Construit un objet dont le contenu initial est un objet de type std::decay_t<ValueType>, initialisé directement sans liste à partir de il, std::forward<Args>(args)....
  • Cette surcharge participe à la résolution de surcharge seulement si std::is_constructible_v<std::decay_t<ValueType>, std::initializer_list<U>&, Args...> et std::is_copy_constructible_v<std::decay_t<ValueType>> sont tous deux true.

Paramètres du modèle

ValueType - type de valeur contenu
Exigences de type
-
std::decay_t<ValueType> doit satisfaire aux exigences de CopyConstructible .

Paramètres

other - autre any objet à copier ou déplacer
value - valeur pour initialiser la valeur contenue
il, args - arguments à transmettre au constructeur de l'objet contenu

Exceptions

2,4-6) Lance toute exception levée par le constructeur du type contenu.

Notes

Parce que le constructeur par défaut est constexpr , les std::any statiques sont initialisés dans le cadre de l'initialisation non-locale statique , avant que toute initialisation non-locale dynamique ne commence. Cela rend sûr d'utiliser un objet de type std::any dans le constructeur de tout objet statique.

Exemple

#include <boost/core/demangle.hpp>
#include <any>
#include <initializer_list>
#include <iostream>
#include <memory>
#include <set>
#include <string>
#include <utility>
struct A
{
    int age;
    std::string name;
    double salary;
#if __cpp_aggregate_paren_init < 201902L
    // Requis avant C++20 pour la construction en place
    A(int age, std::string name, double salary)
        : age(age), name(std::move(name)), salary(salary) {}
#endif
};
// Utilisation de abi demangle pour afficher le nom de type lisible de l'instance de any
void printType(const std::any& a)
{
    std::cout << boost::core::demangle(a.type().name()) << '\n';
}
int main()
{
    // Constructeur #4 : std::any contenant un int
    std::any a1{7};
    // Constructeur #5 : std::any contenant A, construit en place
    std::any a2(std::in_place_type<A>, 30, "Ada", 1000.25);
    // Constructeur #6 : std::any contenant un set de A avec comparaison personnalisée
    auto lambda = [](auto&& l, auto&& r){ return l.age < r.age; };
    std::any a3(
        std::in_place_type<std::set<A, decltype(lambda)>>,
        {
            A{39, std::string{"Ada"}, 100.25},
            A{20, std::string{"Bob"}, 75.5}
        },
        lambda);
    printType(a1);
    printType(a2);
    printType(a3);
}

Sortie possible :

int
A
std::set<A, main::{lambda(auto:1&&, auto:2&&)#1}, std::allocator<A> >

Voir aussi

assigne un objet any
(fonction membre publique)