#include <Corrade/Containers/Optional.h>
template<class T>
Optional class
Lightweight optional value.
Equivalent to std::T
. The optional object can be seen as a container of T
objects with maximal size 1 and can be in two states, either empty or having a value. A non-allocating counterpart to Pointer.
A common use for an optional object is for a return value of function that can fail — like Pointer, but without the unnecessary allocation overhead. Similarly to Pointer, the presence of an object can be checked using operator bool(), or alternatively by comparing to NullOpt (same as a pointer can be compared to nullptr
). The stored object can be accessed using operator->(), operator*() or using implicit conversion, while attempt to access a stored object in an empty state leads to assertion error.
Unlike std::constexpr
implementation or ordering operators, which makes it fairly simple and lightweight. If you need the extra features, use the standard std::
STL compatibility
Instances of Optional are explicitly copy- and move-convertible to and from std::#include <optional>
, which significantly affects compile times. Additionally, the optional(T&&) overload also allows for such a conversion. Example:
#include <Corrade/Containers/Optional.h> … std::optional<int> a{5}; Containers::Optional<int> b(a); std::optional<std::string> c(Containers::Optional<std::string>{"hello"}); auto d = Containers::optional(std::optional<int>{17}); // d is Containers::Optional<int>
Public types
- using Type = T new in Git master
- Value type.
Constructors, destructors, conversion operators
- Optional(NullOptT = NullOpt) noexcept
- Default constructor.
- Optional(const T& value) noexcept(…)
- Construct optional object by copy.
- Optional(T&& value) noexcept(…)
- Construct optional object by move.
-
template<class ... Args>Optional(Corrade::
InPlaceInitT, Args && ... args) noexcept(…) - Construct optional object in-place.
-
template<class U, class = decltype(Implementation::OptionalConverter<T, U>::from(std::Optional(const U& other) explicit noexcept(…)
declval<const U&>()))> - Copy-construct an optional from external representation.
-
template<class U, class = decltype(Implementation::OptionalConverter<T, U>::from(std::Optional(U&& other) explicit noexcept(…)
declval<U && >()))> - Move-construct an optional from external representation.
- Optional(const Optional<T>& other) noexcept(…)
- Copy constructor.
- Optional(Optional<T>&& other) noexcept(…)
- Move constructor.
-
template<class U, class = decltype(Implementation::OptionalConverter<T, U>::to(std::operator U() const & explicit
declval<const Optional<T>&>()))> - Copy-convert the optional to external representation.
-
template<class U, class = decltype(Implementation::OptionalConverter<T, U>::to(std::operator U() && explicit
declval<Optional<T> && >()))> - Move-convert the optional to external representation.
- ~Optional()
- Destructor.
- operator bool() const explicit
- Whether the optional object has a value.
Public functions
- auto operator=(const Optional<T>& other) -> Optional<T>& noexcept(…)
- Copy assignment.
- auto operator=(Optional<T>&& other) -> Optional<T>& noexcept(…)
- Move assignment.
- auto operator=(NullOptT) -> Optional<T>& noexcept
- Clear the contained value.
- auto operator==(const Optional<T>& other) const -> bool
- Equality comparison to another optional.
- auto operator!=(const Optional<T>& other) const -> bool
- Non-equality comparison to another optional.
- auto operator==(NullOptT) const -> bool
- Equality comparison to a null optional.
- auto operator!=(NullOptT) const -> bool
- Non-equality comparison to a null optional.
- auto operator==(const T& other) const -> bool
- Equality comparison to a value.
- auto operator!=(const T& other) const -> bool
- Non-equality comparison to a value.
- auto operator->() -> T*
- Access the stored object.
- auto operator->() const -> const T*
- auto operator*() & -> T&
- Access the stored object.
- auto operator*() && -> T
- auto operator*() const & -> const T&
-
template<class ... Args>auto emplace(Args && ... args) -> T&
- Emplace a new value.
Function documentation
template<class T>
Corrade:: Containers:: Optional<T>:: Optional(const T& value) noexcept(…)
Construct optional object by copy.
Stores a copy of passed object.
template<class T>
Corrade:: Containers:: Optional<T>:: Optional(T&& value) noexcept(…)
Construct optional object by move.
Moves the passed object to internal storage.
template<class T>
template<class ... Args>
Corrade:: Containers:: Optional<T>:: Optional(Corrade:: InPlaceInitT,
Args && ... args) noexcept(…)
Construct optional object in-place.
Constructs the value by passing args
to its constructor in-place.
template<class T>
template<class U, class = decltype(Implementation::OptionalConverter<T, U>::from(std:: declval<const U&>()))>
Corrade:: Containers:: Optional<T>:: Optional(const U& other) explicit noexcept(…)
Copy-construct an optional from external representation.
template<class T>
template<class U, class = decltype(Implementation::OptionalConverter<T, U>::from(std:: declval<U && >()))>
Corrade:: Containers:: Optional<T>:: Optional(U&& other) explicit noexcept(…)
Move-construct an optional from external representation.
template<class T>
template<class U, class = decltype(Implementation::OptionalConverter<T, U>::to(std:: declval<const Optional<T>&>()))>
Corrade:: Containers:: Optional<T>:: operator U() const & explicit
Copy-convert the optional to external representation.
template<class T>
template<class U, class = decltype(Implementation::OptionalConverter<T, U>::to(std:: declval<Optional<T> && >()))>
Corrade:: Containers:: Optional<T>:: operator U() && explicit
Move-convert the optional to external representation.
template<class T>
Corrade:: Containers:: Optional<T>:: ~Optional()
Destructor.
If the optional object is not empty, calls destructor on stored value.
template<class T>
Corrade:: Containers:: Optional<T>:: operator bool() const explicit
Whether the optional object has a value.
Returns true
if the optional object has a value, false
otherwise.
template<class T>
Optional<T>& Corrade:: Containers:: Optional<T>:: operator=(Optional<T>&& other) noexcept(…)
Move assignment.
If both objects contain a value, the value is swapped. Otherwise, if the object contains a value, calls its destructor. If other
contains a value, move-constructs the value from it using placement new.
template<class T>
Optional<T>& Corrade:: Containers:: Optional<T>:: operator=(NullOptT) noexcept
Clear the contained value.
If the object contains a value, calls its destructor. Compared to operator=(Optional<T>&&) this doesn't require the type to be move-assignable.
template<class T>
bool Corrade:: Containers:: Optional<T>:: operator==(const Optional<T>& other) const
Equality comparison to another optional.
Returns true
if either both instances are empty or both instances have a value and the values compare equal, false
otherwise.
template<class T>
bool Corrade:: Containers:: Optional<T>:: operator!=(const Optional<T>& other) const
Non-equality comparison to another optional.
Returns negation of operator==(const Optional<T>&) const.
template<class T>
bool Corrade:: Containers:: Optional<T>:: operator==(NullOptT) const
Equality comparison to a null optional.
Returns true
if the instance is empty, false
otherwise.
template<class T>
bool Corrade:: Containers:: Optional<T>:: operator!=(NullOptT) const
Non-equality comparison to a null optional.
Returns true
if the instance has a value, false
otherwise.
template<class T>
bool Corrade:: Containers:: Optional<T>:: operator==(const T& other) const
Equality comparison to a value.
Returns true
if the instance has a value which compares equal to other
, false
otherwise.
template<class T>
bool Corrade:: Containers:: Optional<T>:: operator!=(const T& other) const
Non-equality comparison to a value.
Returns negation of operator==(const T&) const.
template<class T>
T* Corrade:: Containers:: Optional<T>:: operator->()
Access the stored object.
Expects that the optional object has a value.
template<class T>
const T* Corrade:: Containers:: Optional<T>:: operator->() const
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
template<class T>
T& Corrade:: Containers:: Optional<T>:: operator*() &
Access the stored object.
Expects that the optional object has a value.
template<class T>
T Corrade:: Containers:: Optional<T>:: operator*() &&
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
template<class T>
const T& Corrade:: Containers:: Optional<T>:: operator*() const &
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
template<class T>
template<class ... Args>
T& Corrade:: Containers:: Optional<T>:: emplace(Args && ... args)
Emplace a new value.
If the object already contains a value, calls its destructor. Constructs the value by passing args
to its constructor using placement new.
template<class T>
template<class T>
bool operator==(NullOptT,
const Optional<T>& b)
Equality comparison of a null optional and an optional.
See Optional::
template<class T>
template<class T>
bool operator!=(NullOptT,
const Optional<T>& b)
Non-euality comparison of a null optional and an optional.
See Optional::
template<class T>
template<class T>
bool operator==(const T& a,
const Optional<T>& b)
Equality comparison of a value and an optional.
See Optional::
template<class T>
template<class T>
bool operator!=(const T& a,
const Optional<T>& b)
Non-equality comparison of a value and an optional.
See Optional::
template<class T>
template<class T>
Optional<typename std:: decay<T>::type> optional(T&& value)
Make an optional.
Convenience alternative to Optional::
std::string value; auto a = Containers::Optional<std::string>{value}; auto b = Containers::optional(value);
template<class T>
template<class T, class ... Args>
Optional<T> optional(Args && ... args)
Make an optional.
Convenience alternative to Optional::
auto a = Containers::Optional<std::string>{InPlaceInit, 'a', 'b'}; auto b = Containers::optional<std::string>('a', 'b');
template<class T>
template<class T>
auto optional(T&& other)
Make an optional from external representation.
template<class T>
template<class T>
Utility:: Debug& operator<<(Utility:: Debug& debug,
const Optional<T>& value)
Debug output operator.