Program Listing for File unwrap_shared.hpp

Return to documentation for file (include/eat/utilities/unwrap_shared.hpp)

#pragma once
#include <memory>

namespace eat::utilities {

namespace detail {
template <typename T>
struct UnwrapShared {
  template <typename U>
  U operator()(U &&value) {
    return value;
  }

  using type = T;
};

template <typename T>
struct UnwrapShared<std::shared_ptr<T>> {
  template <typename U>
  auto &&operator()(U &&value) {
    return *value;
  }

  using type = T;
};

}  // namespace detail

template <typename T>
auto unwrap_shared(T &&value) -> decltype(detail::UnwrapShared<std::remove_cvref_t<T>>{}(std::forward<T>(value))) {
  return detail::UnwrapShared<std::remove_cvref_t<T>>{}(std::forward<T>(value));
}

}  // namespace eat::utilities