Adds automatic casting on assignment of non-pyobject types (#551)

This adds automatic casting when assigning to python types like dict,
list, and attributes.  Instead of:

    dict["key"] = py::cast(val);
    m.attr("foo") = py::cast(true);
    list.append(py::cast(42));

you can now simply write:

    dict["key"] = val;
    m.attr("foo") = true;
    list.append(42);

Casts needing extra parameters (e.g. for a non-default rvp) still
require the py::cast() call. set::add() is also supported.

All usage is channeled through a SFINAE implementation which either just returns or casts. 

Combined non-converting handle and autocasting template methods via a
helper method that either just returns (handle) or casts (C++ type).
This commit is contained in:
Jason Rhinelander
2016-12-12 17:42:52 -05:00
committed by Wenzel Jakob
parent 7c9ef7b553
commit 3f1ff3f4d1
9 changed files with 110 additions and 26 deletions

View File

@@ -88,7 +88,7 @@ void throws_logic_error() {
struct PythonCallInDestructor {
PythonCallInDestructor(const py::dict &d) : d(d) {}
~PythonCallInDestructor() { d["good"] = py::cast(true); }
~PythonCallInDestructor() { d["good"] = true; }
py::dict d;
};