@@ -30,31 +30,22 @@ namespace phlex::experimental {
3030 using const_reference = value_type const &;
3131 using const_pointer = value_type const *;
3232
33- handle () = default ;
34-
3533 template <typename U>
36- explicit handle (product<U> const & prod, level_id const & id = level_id::base() )
34+ explicit handle (U const * prod, level_id const & id)
3735 requires detail::same_handle_type<T, U>
38- : rep_{& prod. obj }, id_{&id}
36+ : rep_{prod}, id_{&id}
3937 {
4038 }
4139
42- explicit handle (std::variant<const_pointer, err_t > maybe_product, level_id const & id) :
43- rep_{std::move (maybe_product)}, id_{&id}
40+ template <typename U>
41+ explicit handle (product<U> const & prod, level_id const & id = level_id::base())
42+ requires detail::same_handle_type<T, U>
43+ : handle{&prod.obj , id}
4444 {
4545 }
4646
47- explicit handle (std::string err_msg, level_id const & id) : rep_{std::move (err_msg)}, id_{&id} {}
48-
49- const_pointer operator ->() const
50- {
51- if (auto const * err = get_if<err_t >(&rep_)) {
52- throw std::runtime_error (*err);
53- }
54- return get<const_pointer>(rep_);
55- }
56- [[nodiscard]] const_reference operator *() const { return *operator ->(); }
57- explicit operator bool () const noexcept { return get_if<const_pointer>(&rep_) != nullptr ; }
47+ const_pointer operator ->() const noexcept { return rep_; }
48+ [[nodiscard]] const_reference operator *() const noexcept { return *operator ->(); }
5849 operator const_reference () const noexcept { return operator *(); }
5950 operator const_pointer () const noexcept { return operator ->(); }
6051
@@ -71,9 +62,8 @@ namespace phlex::experimental {
7162 }
7263
7364 private:
74- std::variant<const_pointer, err_t > rep_{" Cannot dereference empty handle of type '" +
75- boost::core::demangle (typeid (T).name ()) + " '." };
76- class level_id const * id_;
65+ const_pointer rep_{nullptr };
66+ class level_id const * id_{nullptr };
7767 };
7868
7969 template <typename T>
0 commit comments