Skip to content

Commit 5462072

Browse files
committed
Fix derived → base conversions
1 parent 8a1dc0e commit 5462072

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

include/jni/object.hpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,20 @@ namespace jni
5454
template < class Tag, class Enable = void >
5555
struct SuperObject;
5656

57+
template < class Tag, class = int >
58+
struct HasSuperTag : std::false_type {};
59+
60+
template < class Tag >
61+
struct HasSuperTag<Tag, decltype(std::declval<typename Tag::SuperTag>(), 0)> : std::true_type {};
62+
5763
template < class Tag >
58-
struct SuperObject<Tag, typename Tag::SuperTag>
64+
struct SuperObject<Tag, std::enable_if_t<HasSuperTag<Tag>::value>>
5965
{
6066
using Type = Object<typename Tag::SuperTag>;
6167
};
6268

6369
template < class Tag >
64-
struct SuperObject<Tag>
70+
struct SuperObject<Tag, std::enable_if_t<!HasSuperTag<Tag>::value>>
6571
{
6672
using Type = Object<ObjectTag>;
6773
};

include/jni/tagging.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ namespace jni
6565
deleter(std::move(other.get_deleter())) {}
6666

6767
template < class U >
68-
Tagged(Tagged<U, D>&& other)
68+
Tagged(Tagged<U, D>&& other, std::enable_if_t<std::is_convertible<const U&, const T&>::value>* = nullptr)
6969
: T(other.release()),
7070
deleter(std::move(other.get_deleter())) {}
7171

test/high_level.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ namespace
2323
};
2424

2525
struct Base {};
26-
struct Derived : public Base {};
26+
struct Derived
27+
{
28+
using SuperTag = Base;
29+
};
2730
}
2831

2932
template < char... Cs >

0 commit comments

Comments
 (0)