Skip to content

Commit 95a33cd

Browse files
Passes tests
1 parent ee20491 commit 95a33cd

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

include/pybind11/cast.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,17 +1364,16 @@ template <typename... Ts> class type_caster<std::tuple<Ts...>>
13641364

13651365
/// Helper class which abstracts away certain actions. Users can provide specializations for
13661366
/// custom holders, but it's only necessary if the type has a non-standard interface.
1367-
template <typename T>
1367+
template <typename T, typename SFINAE = void>
13681368
struct holder_helper {
13691369
static auto get(const T &p) -> decltype(p.get()) { return p.get(); }
13701370
};
13711371

1372-
// Specialization for `unique_ptr<>` to address #1138.
1373-
template <typename type, typename deleter>
1374-
struct holder_helper<std::unique_ptr<type, deleter>> {
1375-
using T = std::unique_ptr<type, deleter>;
1376-
static type* get(const T& p) { return p.get(); }
1377-
static type* get(T&& p) { return p.release(); }
1372+
// Specialization for move-only holders to address #1138.
1373+
template <typename T>
1374+
struct holder_helper<T, enable_if_t<!is_copy_constructible<T>::value>> {
1375+
static auto get(const T &p) -> decltype(p.get()) { return p.get(); }
1376+
static auto get(T &&p) -> decltype(p.get()) { return p.release(); }
13781377
};
13791378

13801379
/// Type caster for holder types like std::shared_ptr, etc.

tests/test_smart_ptr.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ template <typename T> class huge_unique_ptr {
4040
uint64_t padding[10];
4141
public:
4242
huge_unique_ptr(T *p) : ptr(p) {};
43-
T *get() { return ptr.get(); }
43+
T *get() const { return ptr.get(); }
44+
T* release() { return ptr.release(); }
4445
};
4546
PYBIND11_DECLARE_HOLDER_TYPE(T, huge_unique_ptr<T>);
4647

@@ -51,7 +52,7 @@ class custom_unique_ptr {
5152
public:
5253
custom_unique_ptr(T* p) : impl(p) { }
5354
T* get() const { return impl.get(); }
54-
T* release_ptr() { return impl.release(); }
55+
T* release() { return impl.release(); }
5556
};
5657
PYBIND11_DECLARE_HOLDER_TYPE(T, custom_unique_ptr<T>);
5758

0 commit comments

Comments
 (0)