forked from enlightenment/efl
eina_cxx: Allow creating an eina::optional<T> from a type convertible to T
This commit is contained in:
parent
11eff05ead
commit
b713342987
|
@ -4,6 +4,7 @@
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup Eina_Cxx_Data_Types_Group
|
* @addtogroup Eina_Cxx_Data_Types_Group
|
||||||
|
@ -86,7 +87,7 @@ struct optional
|
||||||
*/
|
*/
|
||||||
optional(T&& other) : engaged(false)
|
optional(T&& other) : engaged(false)
|
||||||
{
|
{
|
||||||
_construct(std::move(other));
|
_construct(std::forward<T>(other));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,7 +100,35 @@ struct optional
|
||||||
*/
|
*/
|
||||||
optional(T const& other) : engaged(false)
|
optional(T const& other) : engaged(false)
|
||||||
{
|
{
|
||||||
_construct(std::move(other));
|
_construct(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create an engaged object by moving @p other content.
|
||||||
|
* @param other R-value reference to the desired type.
|
||||||
|
*
|
||||||
|
* This constructor creates an <tt>eina::optional</tt> object in an
|
||||||
|
* engaged state. The contained value is initialized by moving
|
||||||
|
* @p other.
|
||||||
|
*/
|
||||||
|
template <typename U>
|
||||||
|
optional(U&& other, typename std::enable_if<std::is_convertible<U, T>::value>::type* = 0) : engaged(false)
|
||||||
|
{
|
||||||
|
_construct(std::forward<U>(other));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create an engaged object by copying @p other content.
|
||||||
|
* @param other Constant reference to the desired type.
|
||||||
|
*
|
||||||
|
* This constructor creates an <tt>eina::optional</tt> object in an
|
||||||
|
* engaged state. The contained value is initialized by copying
|
||||||
|
* @p other.
|
||||||
|
*/
|
||||||
|
template <typename U>
|
||||||
|
optional(U const& other, typename std::enable_if<std::is_convertible<U, T>::value>::type* = 0) : engaged(false)
|
||||||
|
{
|
||||||
|
_construct(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue