10 #if defined(__INTEL_COMPILER) && __cplusplus >= 201703L 
   14 #include <aligned_new> 
   23 #  pragma warning(disable: 4324) // warning C4324: structure was padded due to alignment specifier 
   37     struct NoConstructor {
 
   38         NoConstructor() = 
default;
 
   39         NoConstructor(
const NoConstructor &) = 
default;
 
   40         NoConstructor(NoConstructor &&) = 
default;
 
   41         static NoConstructor *new_instance() {
 
   42             auto *ptr = 
new NoConstructor();
 
   49     py::class_<NoConstructor>(
m, 
"NoConstructor")
 
   50         .def_static(
"new_instance", &NoConstructor::new_instance, 
"Return an instance");
 
   55         Pet(
const std::string &
name, 
const std::string &species)
 
   56             : m_name(
name), m_species(species) {}
 
   57         std::string 
name()
 const { 
return m_name; }
 
   58         std::string species()
 const { 
return m_species; }
 
   61         std::string m_species;
 
   64     class Dog : 
public Pet {
 
   67         std::string 
bark()
 const { 
return "Woof!"; }
 
   70     class Rabbit : 
public Pet {
 
   72         Rabbit(
const std::string &
name) : Pet(
name, 
"parrot") {}
 
   75     class Hamster : 
public Pet {
 
   77         Hamster(
const std::string &
name) : Pet(
name, 
"rodent") {}
 
   80     class Chimera : 
public Pet {
 
   81         Chimera() : Pet(
"Kimmy", 
"chimera") {}
 
   84     py::class_<Pet> pet_class(
m, 
"Pet");
 
   86         .def(py::init<std::string, std::string>())
 
   87         .def(
"name", &Pet::name)
 
   88         .def(
"species", &Pet::species);
 
   91     py::class_<Dog>(
m, 
"Dog", pet_class)
 
   92         .def(py::init<std::string>());
 
   95     py::class_<Rabbit, Pet>(
m, 
"Rabbit")
 
   96         .def(py::init<std::string>());
 
   99     py::class_<Hamster, Pet>(
m, 
"Hamster")
 
  100         .def(py::init<std::string>());
 
  103     py::class_<Chimera, Pet>(
m, 
"Chimera");
 
  105     m.def(
"pet_name_species", [](
const Pet &pet) { 
return pet.name() + 
" is a " + pet.species(); });
 
  106     m.def(
"dog_bark", [](
const Dog &dog) { 
return dog.
bark(); });
 
  110         BaseClass() = 
default;
 
  111         BaseClass(
const BaseClass &) = 
default;
 
  112         BaseClass(BaseClass &&) = 
default;
 
  113         virtual ~BaseClass() = 
default;
 
  115     struct DerivedClass1 : BaseClass { };
 
  116     struct DerivedClass2 : BaseClass { };
 
  118     py::class_<BaseClass>(
m, 
"BaseClass").def(py::init<>());
 
  119     py::class_<DerivedClass1>(
m, 
"DerivedClass1").def(py::init<>());
 
  120     py::class_<DerivedClass2>(
m, 
"DerivedClass2").def(py::init<>());
 
  122     m.def(
"return_class_1", []() -> BaseClass* { 
return new DerivedClass1(); });
 
  123     m.def(
"return_class_2", []() -> BaseClass* { 
return new DerivedClass2(); });
 
  124     m.def(
"return_class_n", [](
int n) -> BaseClass* {
 
  125         if (n == 1) 
return new DerivedClass1();
 
  126         if (n == 2) 
return new DerivedClass2();
 
  127         return new BaseClass();
 
  129     m.def(
"return_none", []() -> BaseClass* { 
return nullptr; });
 
  132     m.def(
"check_instances", [](py::list l) {
 
  134             py::isinstance<py::tuple>(l[0]),
 
  135             py::isinstance<py::dict>(l[1]),
 
  136             py::isinstance<Pet>(l[2]),
 
  137             py::isinstance<Pet>(l[3]),
 
  138             py::isinstance<Dog>(l[4]),
 
  139             py::isinstance<Rabbit>(l[5]),
 
  140             py::isinstance<UnregisteredType>(l[6])
 
  147     m.def(
"check_type", [](
int category) {
 
  153             return py::type::of<DerivedClass1>();
 
  155             return py::type::of<Invalid>();
 
  158     m.def(
"get_type_of", [](py::object ob) {
 
  159         return py::type::of(ob);
 
  162     m.def(
"get_type_classic", [](py::handle h) {
 
  166     m.def(
"as_type", [](py::object ob) {
 
  171     struct MismatchBase1 { };
 
  172     struct MismatchDerived1 : MismatchBase1 { };
 
  174     struct MismatchBase2 { };
 
  175     struct MismatchDerived2 : MismatchBase2 { };
 
  177     m.def(
"mismatched_holder_1", []() {
 
  178         auto mod = py::module_::import(
"__main__");
 
  179         py::class_<MismatchBase1, std::shared_ptr<MismatchBase1>>(mod, 
"MismatchBase1");
 
  180         py::class_<MismatchDerived1, MismatchBase1>(mod, 
"MismatchDerived1");
 
  182     m.def(
"mismatched_holder_2", []() {
 
  183         auto mod = py::module_::import(
"__main__");
 
  184         py::class_<MismatchBase2>(mod, 
"MismatchBase2");
 
  185         py::class_<MismatchDerived2, std::shared_ptr<MismatchDerived2>,
 
  186                    MismatchBase2>(mod, 
"MismatchDerived2");
 
  192         static std::unique_ptr<MyBase> make() {
 
  193             return std::unique_ptr<MyBase>(
new MyBase());
 
  197     struct MyDerived : MyBase {
 
  198         static std::unique_ptr<MyDerived> make() {
 
  199             return std::unique_ptr<MyDerived>(
new MyDerived());
 
  203     py::class_<MyBase>(
m, 
"MyBase")
 
  204         .def_static(
"make", &MyBase::make);
 
  206     py::class_<MyDerived, MyBase>(
m, 
"MyDerived")
 
  207         .def_static(
"make", &MyDerived::make)
 
  208         .def_static(
"make2", &MyDerived::make);
 
  211     struct ConvertibleFromUserType {
 
  214         ConvertibleFromUserType(UserType u) : 
i(u.value()) { }
 
  217     py::class_<ConvertibleFromUserType>(
m, 
"AcceptsUserType")
 
  218         .def(py::init<UserType>());
 
  219     py::implicitly_convertible<UserType, ConvertibleFromUserType>();
 
  221     m.def(
"implicitly_convert_argument", [](
const ConvertibleFromUserType &r) { 
return r.i; });
 
  222     m.def(
"implicitly_convert_variable", [](py::object o) {
 
  226         const auto &r = o.cast<
const ConvertibleFromUserType &>();
 
  229     m.add_object(
"implicitly_convert_variable_fail", [&] {
 
  230         auto f = [](PyObject *, PyObject *
args) -> PyObject * {
 
  231             auto o = py::reinterpret_borrow<py::tuple>(
args)[0];
 
  233                 o.cast<
const ConvertibleFromUserType &>();
 
  234             } 
catch (
const py::cast_error &e) {
 
  235                 return py::str(e.what()).release().ptr();
 
  237             return py::str().release().ptr();
 
  240         auto def = 
new PyMethodDef{
"f", f, METH_VARARGS, 
nullptr};
 
  241         py::capsule def_capsule(
def, [](
void *ptr) { 
delete reinterpret_cast<PyMethodDef *
>(ptr); });
 
  242         return py::reinterpret_steal<py::object>(PyCFunction_NewEx(
def, def_capsule.ptr(), 
m.ptr()));
 
  248         static void *
operator new(
size_t s) { 
py::print(
"A new", s); return ::operator 
new(s); }
 
  249         static void *
operator new(
size_t s, 
void *ptr) { 
py::print(
"A placement-new", s); 
return ptr; }
 
  250         static void operator delete(
void *p) { 
py::print(
"A delete"); return ::operator 
delete(p); }
 
  252     struct HasOpNewDelSize {
 
  254         static void *
operator new(
size_t s) { 
py::print(
"B new", s); return ::operator 
new(s); }
 
  255         static void *
operator new(
size_t s, 
void *ptr) { 
py::print(
"B placement-new", s); 
return ptr; }
 
  256         static void operator delete(
void *p, 
size_t s) { 
py::print(
"B delete", s); return ::operator 
delete(p); }
 
  258     struct AliasedHasOpNewDelSize {
 
  260         static void *
operator new(
size_t s) { 
py::print(
"C new", s); return ::operator 
new(s); }
 
  261         static void *
operator new(
size_t s, 
void *ptr) { 
py::print(
"C placement-new", s); 
return ptr; }
 
  262         static void operator delete(
void *p, 
size_t s) { 
py::print(
"C delete", s); return ::operator 
delete(p); }
 
  263         virtual ~AliasedHasOpNewDelSize() = 
default;
 
  264         AliasedHasOpNewDelSize() = 
default;
 
  265         AliasedHasOpNewDelSize(
const AliasedHasOpNewDelSize&) = 
delete;
 
  267     struct PyAliasedHasOpNewDelSize : AliasedHasOpNewDelSize {
 
  268         PyAliasedHasOpNewDelSize() = 
default;
 
  269         PyAliasedHasOpNewDelSize(
int) { }
 
  272     struct HasOpNewDelBoth {
 
  274         static void *
operator new(
size_t s) { 
py::print(
"D new", s); return ::operator 
new(s); }
 
  275         static void *
operator new(
size_t s, 
void *ptr) { 
py::print(
"D placement-new", s); 
return ptr; }
 
  276         static void operator delete(
void *p) { 
py::print(
"D delete"); return ::operator 
delete(p); }
 
  277         static void operator delete(
void *p, 
size_t s) { 
py::print(
"D wrong delete", s); return ::operator 
delete(p); }
 
  279     py::class_<HasOpNewDel>(
m, 
"HasOpNewDel").def(py::init<>());
 
  280     py::class_<HasOpNewDelSize>(
m, 
"HasOpNewDelSize").def(py::init<>());
 
  281     py::class_<HasOpNewDelBoth>(
m, 
"HasOpNewDelBoth").def(py::init<>());
 
  282     py::class_<AliasedHasOpNewDelSize, PyAliasedHasOpNewDelSize> aliased(
m, 
"AliasedHasOpNewDelSize");
 
  283     aliased.def(py::init<>());
 
  284     aliased.attr(
"size_noalias") = py::int_(
sizeof(AliasedHasOpNewDelSize));
 
  285     aliased.attr(
"size_alias") = py::int_(
sizeof(PyAliasedHasOpNewDelSize));
 
  289     bind_local<LocalExternal, 17>(
m, 
"LocalExternal", py::module_local());
 
  294         int foo()
 const { 
return value; }
 
  300     class PublicistA : 
public ProtectedA {
 
  302         using ProtectedA::foo;
 
  305     py::class_<ProtectedA>(
m, 
"ProtectedA")
 
  307 #if !defined(_MSC_VER) || _MSC_VER >= 1910 
  308         .def(
"foo", &PublicistA::foo);
 
  310         .def(
"foo", 
static_cast<int (ProtectedA::*)() const
>(&PublicistA::foo));
 
  315         virtual ~ProtectedB() = 
default;
 
  316         ProtectedB() = 
default;
 
  317         ProtectedB(
const ProtectedB &) = 
delete;
 
  320         virtual int foo()
 const { 
return value; }
 
  326     class TrampolineB : 
public ProtectedB {
 
  331     class PublicistB : 
public ProtectedB {
 
  336         ~PublicistB()
 override {};  
 
  337         using ProtectedB::foo;
 
  340     py::class_<ProtectedB, TrampolineB>(
m, 
"ProtectedB")
 
  342 #if !defined(_MSC_VER) || _MSC_VER >= 1910 
  343         .def(
"foo", &PublicistB::foo);
 
  345         .def(
"foo", 
static_cast<int (ProtectedB::*)() const
>(&PublicistB::foo));
 
  349     struct BraceInitialization {
 
  354     py::class_<BraceInitialization>(
m, 
"BraceInitialization")
 
  355         .def(py::init<int, const std::string &>())
 
  356         .def_readwrite(
"field1", &BraceInitialization::field1)
 
  357         .def_readwrite(
"field2", &BraceInitialization::field2);
 
  361     py::class_<NoBraceInitialization>(
m, 
"NoBraceInitialization")
 
  367     struct BogusImplicitConversion {
 
  368         BogusImplicitConversion(
const BogusImplicitConversion &) = 
default;
 
  371     py::class_<BogusImplicitConversion>(
m, 
"BogusImplicitConversion")
 
  372         .def(py::init<const BogusImplicitConversion &>());
 
  374     py::implicitly_convertible<int, BogusImplicitConversion>();
 
  381     py::class_<NestBase> 
base(
m, 
"NestBase");
 
  382     base.def(py::init<>());
 
  383     py::class_<Nested>(
base, 
"Nested")
 
  385         .def(
"fn", [](Nested &, 
int, NestBase &, Nested &) {})
 
  386         .
def(
"fa", [](Nested &, 
int, NestBase &, Nested &) {},
 
  387                 "a"_a, 
"b"_a, 
"c"_a);
 
  388     base.def(
"g", [](NestBase &, Nested &) {});
 
  389     base.def(
"h", []() { 
return NestBase(); });
 
  396     struct NotRegistered {};
 
  397     struct StringWrapper { std::string 
str; };
 
  398     m.def(
"test_error_after_conversions", [](
int) {});
 
  399     m.def(
"test_error_after_conversions",
 
  400           [](StringWrapper) -> NotRegistered { 
return {}; });
 
  401     py::class_<StringWrapper>(
m, 
"StringWrapper").def(py::init<std::string>());
 
  402     py::implicitly_convertible<std::string, StringWrapper>();
 
  404     #if defined(PYBIND11_CPP17) 
  405         struct alignas(1024) Aligned {
 
  406             std::uintptr_t ptr()
 const { 
return (uintptr_t) 
this; }
 
  408         py::class_<Aligned>(
m, 
"Aligned")
 
  410             .def(
"ptr", &Aligned::ptr);
 
  414     struct IsFinal final {};
 
  415     py::class_<IsFinal>(
m, 
"IsFinal", py::is_final());
 
  418     struct IsNonFinalFinal {};
 
  419     py::class_<IsNonFinalFinal>(
m, 
"IsNonFinalFinal", py::is_final());
 
  422     struct PyPrintDestructor {
 
  423         PyPrintDestructor() = 
default;
 
  424         ~PyPrintDestructor() {
 
  427         void throw_something() { 
throw std::runtime_error(
"error"); }
 
  429     py::class_<PyPrintDestructor>(
m, 
"PyPrintDestructor")
 
  431         .def(
"throw_something", &PyPrintDestructor::throw_something);
 
  434     struct SamePointer {};
 
  435     static SamePointer samePointer;
 
  436     py::class_<SamePointer, std::unique_ptr<SamePointer, py::nodelete>>(
m, 
"SamePointer")
 
  440     py::class_<Empty>(
m, 
"Empty")
 
  444     struct BaseWithNested {
 
  448     struct DerivedWithNested : BaseWithNested {
 
  452     py::class_<BaseWithNested> baseWithNested_class(
m, 
"BaseWithNested");
 
  453     py::class_<DerivedWithNested, BaseWithNested> derivedWithNested_class(
m, 
"DerivedWithNested");
 
  454     py::class_<BaseWithNested::Nested>(baseWithNested_class, 
"Nested")
 
  455         .def_static(
"get_name", []() { 
return "BaseWithNested::Nested"; });
 
  456     py::class_<DerivedWithNested::Nested>(derivedWithNested_class, 
"Nested")
 
  457         .def_static(
"get_name", []() { 
return "DerivedWithNested::Nested"; });
 
  461     struct OtherDuplicate {};
 
  462     struct DuplicateNested {};
 
  463     struct OtherDuplicateNested {};
 
  464     m.def(
"register_duplicate_class_name", [](py::module_ 
m) {
 
  465         py::class_<Duplicate>(
m, 
"Duplicate");
 
  466         py::class_<OtherDuplicate>(
m, 
"Duplicate");
 
  468     m.def(
"register_duplicate_class_type", [](py::module_ 
m) {
 
  469         py::class_<OtherDuplicate>(
m, 
"OtherDuplicate");
 
  470         py::class_<OtherDuplicate>(
m, 
"YetAnotherDuplicate");
 
  472     m.def(
"register_duplicate_nested_class_name", [](py::object gt) {
 
  473         py::class_<DuplicateNested>(gt, 
"DuplicateNested");
 
  474         py::class_<OtherDuplicateNested>(gt, 
"DuplicateNested");
 
  476     m.def(
"register_duplicate_nested_class_type", [](py::object gt) {
 
  477         py::class_<OtherDuplicateNested>(gt, 
"OtherDuplicateNested");
 
  478         py::class_<OtherDuplicateNested>(gt, 
"YetAnotherDuplicateNested");
 
  491 using DoesntBreak3 = py::class_<BreaksBase<3>, std::unique_ptr<BreaksBase<3>>>;
 
  496 using DoesntBreak8 = py::class_<BreaksBase<8>, std::shared_ptr<BreaksBase<8>>>;
 
  497 #define CHECK_BASE(N) static_assert(std::is_same<typename DoesntBreak##N::type, BreaksBase<N>>::value, \ 
  498         "DoesntBreak" #N " has wrong type!") 
  500 #define CHECK_ALIAS(N) static_assert(DoesntBreak##N::has_alias && std::is_same<typename DoesntBreak##N::type_alias, BreaksTramp<N>>::value, \ 
  501         "DoesntBreak" #N " has wrong type_alias!") 
  502 #define CHECK_NOALIAS(N) static_assert(!DoesntBreak##N::has_alias && std::is_void<typename DoesntBreak##N::type_alias>::value, \ 
  503         "DoesntBreak" #N " has type alias, but shouldn't!") 
  505 #define CHECK_HOLDER(N, TYPE) static_assert(std::is_same<typename DoesntBreak##N::holder_type, std::TYPE##_ptr<BreaksBase<N>>>::value, \ 
  506         "DoesntBreak" #N " has wrong holder_type!") 
  515 #define CHECK_BROKEN(N) static_assert(std::is_same<typename Breaks##N::type, BreaksBase<-N>>::value, \ 
  516         "Breaks1 has wrong type!");