В этом разделе описаны компоненты, которые программы C ++ могут использовать для выполнения операций с объектами размеченного типа.
[ Note: Размеченный тип может содержать значения разных типов, но не пытается5 выполнить преобразование между ними, т.е. хранится строго какint и не может быть неявно преобразован ни в,"5" ни в5.0. Это безразличие к интерпретации, но осведомленность о типе позволяет эффективно использовать безопасные универсальные контейнеры с отдельными значениями без каких-либо сюрпризов от неоднозначных преобразований. ] — end note
namespace std { // [any.bad_any_cast], class bad_any_cast class bad_any_cast; // [any.class], class any class any; // [any.nonmembers], non-member functions void swap(any& x, any& y) noexcept; template <class T, class... Args> any make_any(Args&& ...args); template <class T, class U, class... Args> any make_any(initializer_list<U> il, Args&& ...args); 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); template<class T> const T* any_cast(const any* operand) noexcept; template<class T> T* any_cast(any* operand) noexcept; }
class bad_any_cast : public bad_cast { public: const char* what() const noexcept override; };
const char* what() const noexcept override;
Remarks: Сообщение может быть многобайтовой строкой с завершающим нулем ([multibyte.strings]), подходящей для преобразования и отображения как wstring ([string.classes],[locale.codecvt]).
class any { public: // [any.cons], construction and destruction constexpr any() noexcept; any(const any& other); any(any&& other) noexcept; template <class T> any(T&& value); template <class T, class... Args> explicit any(in_place_type_t<T>, Args&&...); template <class T, class U, class... Args> explicit any(in_place_type_t<T>, initializer_list<U>, Args&&...); ~any(); // [any.assign], assignments any& operator=(const any& rhs); any& operator=(any&& rhs) noexcept; template <class T> any& operator=(T&& rhs); // [any.modifiers], modifiers template <class T, class... Args> decay_t<T>& emplace(Args&& ...); template <class T, class U, class... Args> decay_t<T>& emplace(initializer_list<U>, Args&&...); void reset() noexcept; void swap(any& rhs) noexcept; // [any.observers], observers bool has_value() const noexcept; const type_info& type() const noexcept; };
Объект классаany хранит экземпляр любого типа, который удовлетворяет требованиям конструктора или не имеет значения, и это называется объектомstate классаany . Сохраненный экземпляр называется.contained valueДва состояния эквивалентны, если либо они оба не имеют значения, либо оба имеют значение, а содержащиеся значения эквивалентны.
Функции, не являющиеся членами,any_cast обеспечивают безопасный для типов доступ к содержащемуся значению.
Реализации должны избегать использования динамически выделяемой памяти для небольшого содержащегося значения. [ Example: где построенный объект содержит только файлint. ] Такая оптимизация малых объектов должна применяться только к типам, для которых есть . — end example T is_nothrow_move_constructible_v<T> true
constexpr any() noexcept;
any(const any& other);
Effects: Еслиother.has_value() естьfalse, создает объект, не имеющий значения. В противном случае эквивалентноany(in_place<T>, any_cast<const T&>(other)) гдеT - тип содержащегося объекта.
Throws: Любые исключения, возникающие при вызове выбранного конструктора для содержащегося значения.
any(any&& other) noexcept;
Effects: Еслиother.has_value() естьfalse, создает объект, не имеющий значения. В противном случае создает объект типа,any который содержит либо содержащийся объектother, либо содержит объект того же типа, созданный из содержащегося объекта,other рассматривая этот содержащийся объект как rvalue.
template<class T>
any(T&& value);
Effects: Создает объект типа,any который содержит объект типа,VT инициализированный напрямую с помощьюstd::forward<T>(value).
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если VT он не относится к тому же типу, что иany, VT не является специализациейin_place_type_tи неis_copy_constructible_v<VT> являетсяtrue.
template <class T, class... Args>
explicit any(in_place_type_t<T>, Args&&... args);
Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиstd::forward<Args>(args)....
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если is_copy_constructible_v<VT> неtrue и is_constructible_v<VT, Args...> являетсяtrue.
template <class T, class U, class... Args>
explicit any(in_place_type_t<T>, initializer_list<U> il, Args&&... args);
Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиil, std::forward<Args>(args)....
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если is_copy_constructible_v<VT> неtrue и is_constructible_v<VT, initializer_list<U>&, Args...> являетсяtrue.
~any();
any& operator=(const any& rhs);
any& operator=(any&& rhs) noexcept;
Postconditions: Состояние*this эквивалентно исходному состояниюrhs иrhs остается в допустимом, но в остальном не указанном состоянии.
template<class T>
any& operator=(T&& rhs);
Effects: Создает объектtmp типа,any который содержит объект типа,VT инициализированный напрямую с помощьюstd::forward<T>(rhs), иtmp.swap(*this). Никаких эффектов, если выбрасывается исключение.
Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если VT не является таким же типом , какany и is_copy_constructible_v<VT> естьtrue.
template <class T, class... Args>
decay_t<T>& emplace(Args&&... args);
Effects: Звонкиreset(). Затем инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиstd::forward<Args>(args)....
Remarks: Если во время вызоваVTконструктора возникает исключение , *this он не содержит значения и любое ранее содержащееся значение было уничтожено. Эта функция не будет участвовать в разрешении перегрузки , если is_copy_constructible_v<VT> неtrue и is_constructible_v<VT, Args...> являетсяtrue.
template <class T, class U, class... Args>
decay_t<T>& emplace(initializer_list<U> il, Args&&... args);
Effects: Звонкиreset(). Затем инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументами il, std::forward<Args>(args)....
Remarks: Если во время вызоваVTконструктора возникает исключение , *this он не содержит значения и любое ранее содержащееся значение было уничтожено. Функция не должна участвовать в разрешении перегрузки, за исключением случаев, когда is_copy_constructible_v<VT> естьtrue и is_constructible_v<VT, initializer_list<U>&, Args...> естьtrue.
void reset() noexcept;
void swap(any& rhs) noexcept;
bool has_value() const noexcept;
const type_info& type() const noexcept;
void swap(any& x, any& y) noexcept;
template <class T, class... Args>
any make_any(Args&& ...args);
template <class T, class U, class... Args>
any make_any(initializer_list<U> il, Args&& ...args);
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);
Requires: Для первой перегрузкиis_constructible_v<ValueType, const U&> естьtrue. Для второй перегрузкиis_constructible_v<ValueType, U&> естьtrue. Для третьей перегрузкиis_constructible_v<ValueType, U> естьtrue. В противном случае программа будет некорректной.
Returns: Для первой и второй перегрузкиstatic_cast<ValueType>(*any_cast<U>(&operand)). Для третьей перегрузкиstatic_cast<ValueType>(std::move(*any_cast<U>(&operand))).
[ Example:
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 ]
template<class T>
const T* any_cast(const any* operand) noexcept;
template<class T>
T* any_cast(any* operand) noexcept;
Returns: Еслиoperand != nullptr && operand->type() == typeid(T), указатель на объект, содержащийся вoperand; в противном случаеnullptr.