48#if LASS_HAVE_STD_VARIANT
64 static PyObject* build(std::monostate)
68 static int get(PyObject* obj, std::monostate&)
72 PyErr_SetString(PyExc_TypeError,
"Not None");
83template <
typename Variant,
typename ...T>
struct PyExportTraitsVariantImpl;
85template <
typename Variant,
typename Head,
typename ...Tail>
86struct PyExportTraitsVariantImpl<Variant, Head, Tail...>
88 static int get(PyObject* obj, Variant& v)
91 if (PyExportTraits<Head>::get(obj, head) == 0)
97 return PyExportTraitsVariantImpl<Variant, Tail...>::get(obj, v);
101template <
typename Variant,
typename ...Tail>
102struct PyExportTraitsVariantImpl<Variant, bool, Tail...>
113 static int get(PyObject* obj, Variant& v)
115 if (PyBool_Check(obj))
122 return PyExportTraitsVariantImpl<Variant, Tail...>::get(obj, v);
126template <
typename Variant>
127struct PyExportTraitsVariantImpl<Variant>
129 static int get(PyObject* , Variant& )
131 PyErr_SetString(PyExc_TypeError,
"Unable to cast to variant");
180template <
typename... T>
183 constexpr static const char* py_typing =
"Union[T...]";
185 using TVariant = std::variant<T...>;
187 static PyObject* build(
const TVariant& v)
189 return std::visit([](
auto&& arg) -> PyObject* {
190 using U = std::decay_t<
decltype(arg)>;
191 return PyExportTraits<U>::build(arg);
195 static int get(PyObject* obj, TVariant& v)
197 return impl::PyExportTraitsVariantImpl<TVariant, T...>::get(obj, v);
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
by copy, general case assumes shadow type or PyObjectPlus based type.