mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-27 16:33:34 +08:00
try_implicit_cast<>() supports non default constructible target types
This commit is contained in:
@@ -101,10 +101,17 @@ struct TryImplicitCastImpl
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename To, typename From>
|
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_,
|
return TryImplicitCastImpl<From, To>::impl(from, default_,
|
||||||
BooleanType<IsImplicitlyConvertibleFromTo<From, To>::Result>());
|
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>());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <uavcan/util/compile_time.hpp>
|
#include <uavcan/util/compile_time.hpp>
|
||||||
|
|
||||||
struct NonConvertible { };
|
struct NonConvertible { };
|
||||||
|
|
||||||
struct ConvertibleToBool
|
struct ConvertibleToBool
|
||||||
{
|
{
|
||||||
const bool value;
|
const bool value;
|
||||||
@@ -14,6 +15,11 @@ struct ConvertibleToBool
|
|||||||
bool operator!() const { return !value; }
|
bool operator!() const { return !value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct NonDefaultConstructible
|
||||||
|
{
|
||||||
|
NonDefaultConstructible(int) { }
|
||||||
|
};
|
||||||
|
|
||||||
TEST(Util, TryImplicitCast)
|
TEST(Util, TryImplicitCast)
|
||||||
{
|
{
|
||||||
using uavcan::try_implicit_cast;
|
using uavcan::try_implicit_cast;
|
||||||
@@ -30,4 +36,7 @@ TEST(Util, TryImplicitCast)
|
|||||||
ASSERT_FALSE(try_implicit_cast<bool>(ConvertibleToBool(false), true));
|
ASSERT_FALSE(try_implicit_cast<bool>(ConvertibleToBool(false), true));
|
||||||
ASSERT_EQ(1, try_implicit_cast<long>(ConvertibleToBool(true)));
|
ASSERT_EQ(1, try_implicit_cast<long>(ConvertibleToBool(true)));
|
||||||
ASSERT_EQ(0, try_implicit_cast<long>(ConvertibleToBool(false), -100));
|
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));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user