Hi,
This is the second time that I have found the following function useful
when playing with variants of Optional library:
template
typename std::enable_if::value, T>::type
convert(U && u)
{ return std::forward<U>(u); }
It performs an implicit conversion from U to T, but you can call it
explicitly.
[1st] time I needed it to implement the behavior of value_or (described in
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3672.html#optional....
):
template <class U> constexpr T optional<T>::value_or(U&& v) const&;
Requires:
is_copy_constructible<T>::value is true and is_convertible::value
is true.
Returns:
bool(*this) ? **this : static_cast<T>(std::forward<U>(v)).
This needs to be implemented in one expression in C++11, because the
function is constexpr, so in the ternary operator, I could either apply no
cast and risk unnecessary ambiguity in result type in certain cases, or use
a static_cast and bring the explicit conversions in that I didn't want.
Function convert() saved the day.
[2nd] time was when trying to disable the overload in C++11 using SFINAE,
but I didn't want to use enable_if (see a more complete example here:
http://akrzemi1.wordpress.com/examples/overloading-enable_if-3/):
template <typename U>
auto value_or(U const& v) const -> decltype(convert<T>(v))
{
if (*this)
return this->value();
else
return v;
}
template <typename F>
auto value_or(F const& f) const -> decltype(convert<T>(f()))
{
if (*this)
return this->value();
else
return f();
}
I wanted to check with Boost developers if you find such function convert
generally useful (and worth adding somewhere in Boost), or is it just my
specific needs.
Regards,
&rzej