• Jason Rhinelander's avatar
    Allow arbitrary class_ template option ordering · 5fffe200
    Jason Rhinelander authored
    The current pybind11::class_<Type, Holder, Trampoline> fixed template
    ordering results in a requirement to repeat the Holder with its default
    value (std::unique_ptr<Type>) argument, which is a little bit annoying:
    it needs to be specified not because we want to override the default,
    but rather because we need to specify the third argument.
    
    This commit removes this limitation by making the class_ template take
    the type name plus a parameter pack of options.  It then extracts the
    first valid holder type and the first subclass type for holder_type and
    trampoline type_alias, respectively.  (If unfound, both fall back to
    their current defaults, `std::unique_ptr<type>` and `type`,
    respectively).  If any unmatched template arguments are provided, a
    static assertion fails.
    
    What this means is that you can specify or omit the arguments in any
    order:
    
        py::class_<A, PyA> c1(m, "A");
        py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
        py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
    
    It also allows future class attributes (such as base types in the next
    commit) to be passed as class template types rather than needing to use
    a py::base<> wrapper.
    5fffe200
test_virtual_functions.cpp 11.8 KB