Use a universal reference to implement dereferenceMaybe()

This commit is contained in:
Martchus 2020-02-18 19:20:24 +01:00
parent 0733f0705d
commit c7c5352325
2 changed files with 5 additions and 16 deletions

View File

@ -159,25 +159,13 @@ CPP_UTILITIES_TRAITS_DEFINE_TYPE_CHECK(IsIteratable,
void(*begin(std::declval<T &>())));
/// \brief Dereferences the specified \a value if possible; otherwise just returns \a value itself.
template <typename T, EnableIf<IsDereferencable<T>> * = nullptr> constexpr auto &dereferenceMaybe(T &value)
template <typename T, EnableIf<IsDereferencable<T>> * = nullptr> constexpr auto &dereferenceMaybe(T &&value)
{
return *value;
}
/// \brief Dereferences the specified \a value if possible; otherwise just returns \a value itself.
template <typename T, DisableIf<IsDereferencable<T>> * = nullptr> constexpr auto &dereferenceMaybe(T &value)
{
return value;
}
/// \brief Dereferences the specified \a value if possible; otherwise just returns \a value itself.
template <typename T, EnableIf<IsDereferencable<T>> * = nullptr> constexpr const auto &dereferenceMaybe(const T &value)
{
return *value;
}
/// \brief Dereferences the specified \a value if possible; otherwise just returns \a value itself.
template <typename T, DisableIf<IsDereferencable<T>> * = nullptr> constexpr const auto &dereferenceMaybe(const T &value)
template <typename T, DisableIf<IsDereferencable<T>> * = nullptr> constexpr auto &dereferenceMaybe(T &&value)
{
return value;
}

View File

@ -133,8 +133,9 @@ CPPUNIT_TEST_SUITE_REGISTRATION(TraitsTest);
*/
void TraitsTest::testDereferenceMaybe()
{
const auto someString = "foo"s;
const auto someSmartPointer = make_unique<string>("foo");
auto someString = "foo"s;
auto someSmartPointer = make_unique<string>("foo");
CPPUNIT_ASSERT_EQUAL("foo"s, dereferenceMaybe(someString));
CPPUNIT_ASSERT_EQUAL("foo"s, dereferenceMaybe(someSmartPointer));
CPPUNIT_ASSERT_EQUAL("foo"s, dereferenceMaybe(make_unique<string>("foo")));
}