diff --git a/libuavcan/include/uavcan/util/compile_time.hpp b/libuavcan/include/uavcan/util/compile_time.hpp index 093c62f65a..e6777073da 100644 --- a/libuavcan/include/uavcan/util/compile_time.hpp +++ b/libuavcan/include/uavcan/util/compile_time.hpp @@ -101,10 +101,17 @@ struct TryImplicitCastImpl }; template -To try_implicit_cast(const From& from, const To& default_ = To()) +To try_implicit_cast(const From& from, const To& default_) { return TryImplicitCastImpl::impl(from, default_, BooleanType::Result>()); } +template +To try_implicit_cast(const From& from) +{ + return TryImplicitCastImpl::impl(from, To(), + BooleanType::Result>()); +} + } diff --git a/libuavcan/test/util/compile_time.cpp b/libuavcan/test/util/compile_time.cpp index 5e449036e3..f65ab039f2 100644 --- a/libuavcan/test/util/compile_time.cpp +++ b/libuavcan/test/util/compile_time.cpp @@ -6,6 +6,7 @@ #include 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(ConvertibleToBool(false), true)); ASSERT_EQ(1, try_implicit_cast(ConvertibleToBool(true))); ASSERT_EQ(0, try_implicit_cast(ConvertibleToBool(false), -100)); + + //try_implicit_cast(ConvertibleToBool(true)); // Will fail to compile + try_implicit_cast(NonConvertible(), NonDefaultConstructible(64)); }