[any.nonmembers]

# 22 General utilities library [[utilities]](./#utilities)

## 22.7 Storage for any type [[any]](any#nonmembers)

### 22.7.5 Non-member functions [any.nonmembers]

[ð](#lib:swap,any)

`void swap(any& x, any& y) noexcept;
`

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7535)

*Effects*: Equivalent to x.swap(y)[.](#1.sentence-1)

[ð](#lib:make_any)

`template<class T, class... Args>
  any make_any(Args&&... args);
`

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7547)

*Effects*: Equivalent to: return any(in_place_type<T>, std​::​forward<Args>(args)...);

[ð](#lib:make_any_)

`template<class T, class U, class... Args>
  any make_any(initializer_list<U> il, Args&&... args);
`

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7559)

*Effects*: Equivalent to: return any(in_place_type<T>, il, std​::​forward<Args>(args)...);

[ð](#lib:any_cast)

`template<class T>
  T any_cast(const any& operand);
template<class T>
  T any_cast(any& operand);
template<class T>
  T any_cast(any&& operand);
`

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7575)

Let U be the type remove_cvref_t<T>[.](#4.sentence-1)

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7578)

*Mandates*: For the first overload, is_constructible_v<T, const U&> is true[.](#5.sentence-1)

For the second overload, is_constructible_v<T, U&> is true[.](#5.sentence-2)

For the third overload, is_constructible_v<T, U> is true[.](#5.sentence-3)

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7584)

*Returns*: For the first and second overload, static_cast<T>(*any_cast<U>(&operand))[.](#6.sentence-1)

For the third overload, static_cast<T>(std​::​move(*any_cast<U>(&operand)))[.](#6.sentence-2)

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7589)

*Throws*: bad_any_cast if operand.type() != typeid(remove_reference_t<T>)[.](#7.sentence-1)

[8](#8)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7593)

[*Example [1](#example-1)*: any x(5); // x holds int assert(any_cast<int>(x) == 5); // cast to value any_cast<int&>(x) = 10; // cast to reference assert(any_cast<int>(x) == 10);

x = "Meow"; // x holds const char* assert(strcmp(any_cast<const char*>(x), "Meow") == 0);
any_cast<const char*&>(x) = "Harry";
assert(strcmp(any_cast<const char*>(x), "Harry") == 0);

x = string("Meow"); // x holds string string s, s2("Jane");
s = move(any_cast<string&>(x)); // move from any assert(s == "Meow");
any_cast<string&>(x) = move(s2); // move to any assert(any_cast<const string&>(x) == "Jane");

string cat("Meow");const any y(cat); // const y holds string assert(any_cast<const string&>(y) == cat);

any_cast<string&>(y); // error: cannot any_cast away const â *end example*]

[ð](#lib:any_cast_)

`template<class T>
  const T* any_cast(const any* operand) noexcept;
template<class T>
  T* any_cast(any* operand) noexcept;
`

[9](#9)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7631)

*Mandates*: is_void_v<T> is false[.](#9.sentence-1)

[10](#10)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7635)

*Returns*: If operand != nullptr && operand->type() == typeid(T) is true,
a pointer to the object contained by operand;
otherwise, nullptr[.](#10.sentence-1)

[11](#11)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L7641)

[*Example [2](#example-2)*: bool is_string(const any& operand) {return any_cast<string>(&operand) != nullptr;} â *end example*]
