try_implicit_cast<>() supports non default constructible target types

This commit is contained in:
Pavel Kirienko 2014-03-10 11:12:57 +04:00
parent 38e43e58ad
commit 224a072120
2 changed files with 17 additions and 1 deletions

View File

@ -101,10 +101,17 @@ struct TryImplicitCastImpl
};
template <typename To, typename From>
To try_implicit_cast(const From& from, const To& default_ = To())
To try_implicit_cast(const From& from, const To& default_)
{
return TryImplicitCastImpl<From, To>::impl(from, default_,
BooleanType<IsImplicitlyConvertibleFromTo<From, To>::Result>());
}
template <typename To, typename From>
To try_implicit_cast(const From& from)
{
return TryImplicitCastImpl<From, To>::impl(from, To(),
BooleanType<IsImplicitlyConvertibleFromTo<From, To>::Result>());
}
}

View File

@ -6,6 +6,7 @@
#include <uavcan/util/compile_time.hpp>
struct NonConvertible { };
struct ConvertibleToBool
{
const bool value;
@ -14,6 +15,11 @@ struct ConvertibleToBool
bool operator!() const { return !value; }
};
struct NonDefaultConstructible
{
NonDefaultConstructible(int) { }
};
TEST(Util, TryImplicitCast)
{
using uavcan::try_implicit_cast;
@ -30,4 +36,7 @@ TEST(Util, TryImplicitCast)
ASSERT_FALSE(try_implicit_cast<bool>(ConvertibleToBool(false), true));
ASSERT_EQ(1, try_implicit_cast<long>(ConvertibleToBool(true)));
ASSERT_EQ(0, try_implicit_cast<long>(ConvertibleToBool(false), -100));
//try_implicit_cast<NonDefaultConstructible>(ConvertibleToBool(true)); // Will fail to compile
try_implicit_cast<NonDefaultConstructible>(NonConvertible(), NonDefaultConstructible(64));
}