@@ -370,6 +370,48 @@ class cpp_function : public function {
370370 extra...);
371371 }
372372
373+ #ifdef __cpp_noexcept_function_type
374+ // / Construct a cpp_function from a class method (non-const, no ref-qualifier, noexcept)
375+ template <typename Return, typename Class, typename ... Arg, typename ... Extra>
376+ // NOLINTNEXTLINE(google-explicit-constructor)
377+ cpp_function (Return (Class::*f)(Arg...) noexcept , const Extra &...extra ) {
378+ initialize (
379+ [f](Class *c, Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
380+ (Return (*)(Class *, Arg...)) nullptr ,
381+ extra...);
382+ }
383+
384+ // / Construct a cpp_function from a class method (non-const, lvalue ref-qualifier, noexcept)
385+ template <typename Return, typename Class, typename ... Arg, typename ... Extra>
386+ // NOLINTNEXTLINE(google-explicit-constructor)
387+ cpp_function (Return (Class::*f)(Arg...) & noexcept , const Extra &...extra ) {
388+ initialize (
389+ [f](Class *c, Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
390+ (Return (*)(Class *, Arg...)) nullptr ,
391+ extra...);
392+ }
393+
394+ // / Construct a cpp_function from a class method (const, no ref-qualifier, noexcept)
395+ template <typename Return, typename Class, typename ... Arg, typename ... Extra>
396+ // NOLINTNEXTLINE(google-explicit-constructor)
397+ cpp_function (Return (Class::*f)(Arg...) const noexcept , const Extra &...extra ) {
398+ initialize ([f](const Class *c,
399+ Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
400+ (Return (*)(const Class *, Arg...)) nullptr ,
401+ extra...);
402+ }
403+
404+ // / Construct a cpp_function from a class method (const, lvalue ref-qualifier, noexcept)
405+ template <typename Return, typename Class, typename ... Arg, typename ... Extra>
406+ // NOLINTNEXTLINE(google-explicit-constructor)
407+ cpp_function (Return (Class::*f)(Arg...) const & noexcept , const Extra &...extra ) {
408+ initialize ([f](const Class *c,
409+ Arg... args) -> Return { return (c->*f)(std::forward<Arg>(args)...); },
410+ (Return (*)(const Class *, Arg...)) nullptr ,
411+ extra...);
412+ }
413+ #endif
414+
373415 // / Return the function name
374416 object name () const { return attr (" __name__" ); }
375417
@@ -1905,6 +1947,26 @@ auto method_adaptor(Return (Class::*pmf)(Args...) const) -> Return (Derived::*)(
19051947 return pmf;
19061948}
19071949
1950+ #ifdef __cpp_noexcept_function_type
1951+ template <typename Derived, typename Return, typename Class, typename ... Args>
1952+ auto method_adaptor (Return (Class::*pmf)(Args...) noexcept )
1953+ -> Return (Derived::*)(Args...) noexcept {
1954+ static_assert (
1955+ detail::is_accessible_base_of<Class, Derived>::value,
1956+ " Cannot bind an inaccessible base class method; use a lambda definition instead" );
1957+ return pmf;
1958+ }
1959+
1960+ template <typename Derived, typename Return, typename Class, typename ... Args>
1961+ auto method_adaptor (Return (Class::*pmf)(Args...) const noexcept )
1962+ -> Return (Derived::*)(Args...) const noexcept {
1963+ static_assert (
1964+ detail::is_accessible_base_of<Class, Derived>::value,
1965+ " Cannot bind an inaccessible base class method; use a lambda definition instead" );
1966+ return pmf;
1967+ }
1968+ #endif
1969+
19081970PYBIND11_NAMESPACE_BEGIN (detail)
19091971
19101972// Helper for the property_cpp_function static member functions below.
@@ -2361,6 +2423,18 @@ class class_ : public detail::generic_type {
23612423 return def_buffer ([func](const type &obj) { return (obj.*func)(); });
23622424 }
23632425
2426+ #ifdef __cpp_noexcept_function_type
2427+ template <typename Return, typename Class, typename ... Args>
2428+ class_ &def_buffer (Return (Class::*func)(Args...) noexcept ) {
2429+ return def_buffer ([func](type &obj) { return (obj.*func)(); });
2430+ }
2431+
2432+ template <typename Return, typename Class, typename ... Args>
2433+ class_ &def_buffer (Return (Class::*func)(Args...) const noexcept ) {
2434+ return def_buffer ([func](const type &obj) { return (obj.*func)(); });
2435+ }
2436+ #endif
2437+
23642438 template <typename C, typename D, typename ... Extra>
23652439 class_ &def_readwrite (const char *name, D C::*pm, const Extra &...extra) {
23662440 static_assert (std::is_same<C, type>::value || std::is_base_of<C, type>::value,
0 commit comments