Fix std::nullptr_t caster (#840)

* Fix compilation error with std::nullptr_t

* Enable conversion from None to std::nullptr_t and std::nullopt_t

Fixes #839.
This commit is contained in:
Dean Moldovan 2017-05-09 23:30:05 +02:00 committed by GitHub
parent 77710ff01c
commit 78f1dcf98f
3 changed files with 20 additions and 4 deletions

View File

@ -602,7 +602,11 @@ public:
template<typename T> struct void_caster { template<typename T> struct void_caster {
public: public:
bool load(handle, bool) { return false; } bool load(handle src, bool) {
if (src && src.is_none())
return true;
return false;
}
static handle cast(T, return_value_policy /* policy */, handle /* parent */) { static handle cast(T, return_value_policy /* policy */, handle /* parent */) {
return none().inc_ref(); return none().inc_ref();
} }
@ -653,7 +657,7 @@ private:
void *value = nullptr; void *value = nullptr;
}; };
template <> class type_caster<std::nullptr_t> : public type_caster<void_type> { }; template <> class type_caster<std::nullptr_t> : public void_caster<std::nullptr_t> { };
template <> class type_caster<bool> { template <> class type_caster<bool> {
public: public:

View File

@ -359,9 +359,10 @@ test_initializer python_types([](py::module &m) {
const char *operator()(int) { return "int"; } const char *operator()(int) { return "int"; }
const char *operator()(std::string) { return "std::string"; } const char *operator()(std::string) { return "std::string"; }
const char *operator()(double) { return "double"; } const char *operator()(double) { return "double"; }
const char *operator()(std::nullptr_t) { return "std::nullptr_t"; }
}; };
m.def("load_variant", [](std::variant<int, std::string, double> v) { m.def("load_variant", [](std::variant<int, std::string, double, std::nullptr_t> v) {
return std::visit(visitor(), v); return std::visit(visitor(), v);
}); });
@ -516,6 +517,9 @@ test_initializer python_types([](py::module &m) {
}); });
} }
); );
m.def("load_nullptr_t", [](std::nullptr_t) {}); // not useful, but it should still compile
m.def("cast_nullptr_t", []() { return std::nullptr_t{}; });
}); });
#if defined(_MSC_VER) #if defined(_MSC_VER)

View File

@ -378,9 +378,10 @@ def test_variant(doc):
assert load_variant(1) == "int" assert load_variant(1) == "int"
assert load_variant("1") == "std::string" assert load_variant("1") == "std::string"
assert load_variant(1.0) == "double" assert load_variant(1.0) == "double"
assert load_variant(None) == "std::nullptr_t"
assert cast_variant() == (5, "Hello") assert cast_variant() == (5, "Hello")
assert doc(load_variant) == "load_variant(arg0: Union[int, str, float]) -> str" assert doc(load_variant) == "load_variant(arg0: Union[int, str, float, None]) -> str"
def test_constructors(): def test_constructors():
@ -568,3 +569,10 @@ def test_capsule_with_destructor(capture):
creating capsule creating capsule
destructing capsule: 1234 destructing capsule: 1234
""" """
def test_void_caster():
import pybind11_tests as m
assert m.load_nullptr_t(None) is None
assert m.cast_nullptr_t() is None