Scroll to navigation

std::any::any(3) C++ Standard Libary std::any::any(3)

NAME

std::any::any - std::any::any

Synopsis


constexpr any() noexcept; (1) (since C++17)
any( const any& other ); (2) (since C++17)
any( any&& other ) noexcept; (3) (since C++17)
template< class ValueType > (4) (since C++17)
any( ValueType&& value );
template< class ValueType, class... Args > (5) (since C++17)
explicit any( std::in_place_type_t<ValueType>, Args&&... args );
template< class ValueType, class U, class... Args >


explicit any( std::in_place_type_t<ValueType>, (6) (since C++17)
std::initializer_list<U> il,


Args&&... args );


Constructs a new any object.


1) Constructs an empty object.
2-3) Copies (2) or moves (3) content of other into a new instance, so that any
content is equivalent in both type and value to those of other prior to the
constructor call, or empty if other is empty. Formally,
2) If other is empty, the constructed object is empty. Otherwise, equivalent to
any(std::in_place_type<T>, std::any_cast<const T&>(other)), where T is the type of
the object contained in other.
3) If other is empty, the constructed object is empty. Otherwise, the constructed
object contains either the object contained in other, or an object of the same type
constructed from the object contained in other, considering that object as an

rvalue.


4) Constructs an object with initial content an object of type
std::decay_t<ValueType>, direct-initialized from std::forward<ValueType>(value).


* This overload participates in overload resolution only if
std::decay_t<ValueType> is not the same type as any nor a specialization of
std::in_place_type_t, and std::is_copy_constructible_v<std::decay_t<ValueType>>
is true.


5) Constructs an object with initial content an object of type
std::decay_t<ValueType>, direct-non-list-initialized from
std::forward<Args>(args)....


* This overload participates in overload resolution only if
std::is_constructible_v<std::decay_t<ValueType>, Args...> and
std::is_copy_constructible_v<std::decay_t<ValueType>> are both true.


6) Constructs an object with initial content an object of type
std::decay_t<ValueType>, direct-non-list-initialized from il,
std::forward<Args>(args)....


* This overload participates in overload resolution only if
std::is_constructible_v<std::decay_t<ValueType>, std::initializer_list<U>&,
Args...> and std::is_copy_constructible_v<std::decay_t<ValueType>> are both
true.

Template parameters


ValueType - contained value type

Type requirements


-
std::decay_t<ValueType> must meet the requirements of CopyConstructible.

Parameters


other - another any object to copy or move from
value - value to initialize the contained value with
il, args - arguments to be passed to the constructor of the contained object

Exceptions


2,4,5,6) Throws any exception thrown by the constructor of the contained type.

Notes


Because the default constructor is constexpr, static std::anys are initialized as
part of static non-local initialization, before any dynamic non-local initialization
begins. This makes it safe to use an object of type std::any in a constructor of any
static object.

Example

// Run this code


#include <utility>
#include <set>
#include <any>
#include <string>
#include <memory>
#include <iostream>
#include <initializer_list>
#include <cxxabi.h>


struct A {
int age;
std::string name;
double salary;
};


// using abi demangle to print nice type name of instance of any holding
void printType(const std::any& a) {
int status;
if (char* p = abi::__cxa_demangle(a.type().name(), 0, 0, &status)){
std::cout << p << '\n';
std::free(p);
}
}


int main(){
// constructor #4: std::any holding int
std::any a1{7};


// constructor #5: std::any holding A, constructed in place
std::any a2(std::in_place_type_t<A>{}, 30, "Ada", 1000.25);


// constructor #6: std::any holding a set of A with custom comparison
auto lambda = [](auto&& l, auto&& r){ return l.age < r.age; };
std::any a3(
std::in_place_type_t<std::set<A, decltype(lambda)>>{},
std::initializer_list<A>{
{39, std::string{"Ada"}, 100.25},
{20, std::string{"Bob"}, 75.5}
},
lambda);


printType(a1);
printType(a2);
printType(a3);
}

Possible output:


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

See also


operator= assigns an any object
(public member function)

2022.07.31 http://cppreference.com