82class UniquePtrWithLambda
83 :
public std::unique_ptr<
85 auxiliary::CustomDelete<T>>
88 using BasePtr = std::unique_ptr<T, auxiliary::CustomDelete<T>>;
91 using T_decayed = std::remove_extent_t<T>;
93 UniquePtrWithLambda();
95 UniquePtrWithLambda(UniquePtrWithLambda &&)
noexcept;
96 UniquePtrWithLambda &operator=(UniquePtrWithLambda &&)
noexcept;
98 UniquePtrWithLambda(UniquePtrWithLambda
const &) =
delete;
99 UniquePtrWithLambda &operator=(UniquePtrWithLambda
const &) =
delete;
111 typename bare_unique_ptr,
112 typename SFINAE = std::enable_if_t<
113 std::is_same_v<bare_unique_ptr, std::unique_ptr<T>>>>
114 UniquePtrWithLambda(bare_unique_ptr);
125 typename SFINAE = std::enable_if_t<
126 !std::is_same_v<std::unique_ptr<T, Del>, std::unique_ptr<T>>>>
132 UniquePtrWithLambda(T_decayed *);
137 UniquePtrWithLambda(T_decayed *, std::function<
void(T_decayed *)>);
146 template <
typename U>
151template <
typename Del,
typename>
152UniquePtrWithLambda<T>::UniquePtrWithLambda(std::unique_ptr<T, Del> ptr)
153 : BasePtr{ptr.release(), auxiliary::CustomDelete<
T>{[&]() {
154 if constexpr (std::is_copy_constructible_v<Del>)
156 return [deleter = std::move(ptr.get_deleter())](
157 T_decayed *del_ptr) { deleter(del_ptr); };
167 return [deleter = std::make_shared<Del>(
168 std::move(ptr.get_deleter()))](
169 T_decayed *del_ptr) { (*deleter)(del_ptr); };
178 using other_type = std::remove_extent_t<U>;
179 return UniquePtrWithLambda<U>{
180 static_cast<other_type *
>(this->release()),
181 [deleter = std::move(this->get_deleter())](other_type *ptr) {
182 deleter(
static_cast<T_decayed *
>(ptr));