|
|
@@ -178,26 +178,31 @@ template <typename T> struct is_py_class<T, std::void_t<decltype(T::_type)>> : s
|
|
|
template<typename T>
|
|
|
void _check_py_class(VM* vm, const PyVar& var);
|
|
|
|
|
|
+template<typename T>
|
|
|
+T py_pointer_cast(VM* vm, const PyVar& var);
|
|
|
+
|
|
|
template<typename __T>
|
|
|
-std::enable_if_t<!std::is_pointer_v<__T>, __T>
|
|
|
-py_cast(VM* vm, const PyVar& obj) {
|
|
|
+__T py_cast(VM* vm, const PyVar& obj) {
|
|
|
+ if constexpr(std::is_pointer_v<__T>){
|
|
|
+ return py_pointer_cast<__T>(vm, obj);
|
|
|
+ }
|
|
|
using T = std::decay_t<__T>;
|
|
|
if constexpr(is_py_class<T>::value){
|
|
|
_check_py_class<T>(vm, obj);
|
|
|
return OBJ_GET(T, obj);
|
|
|
- }else{
|
|
|
- throw std::runtime_error("bad py_cast() call");
|
|
|
}
|
|
|
+ throw std::runtime_error("bad py_cast() call");
|
|
|
}
|
|
|
template<typename __T>
|
|
|
-std::enable_if_t<!std::is_pointer_v<__T>, __T>
|
|
|
-_py_cast(VM* vm, const PyVar& obj) {
|
|
|
+__T _py_cast(VM* vm, const PyVar& obj) {
|
|
|
+ if constexpr(std::is_pointer_v<__T>){
|
|
|
+ return py_pointer_cast<__T>(vm, obj);
|
|
|
+ }
|
|
|
using T = std::decay_t<__T>;
|
|
|
if constexpr(is_py_class<T>::value){
|
|
|
return OBJ_GET(T, obj);
|
|
|
- }else{
|
|
|
- throw std::runtime_error("bad py_cast() call");
|
|
|
}
|
|
|
+ throw std::runtime_error("bad py_cast() call");
|
|
|
}
|
|
|
|
|
|
#define VAR(x) py_var(vm, x)
|