#pragma once #include #include #include using namespace std; class Base { public: bool is_owning = false; virtual ~Base() = default; }; template class Derived : public Base { public: T *data; Derived() : data(nullptr) {} Derived(T *d) : data(d) {} ~Derived() = default; }; class PyObject { int i; char c; double d; public: Base *test; PyObject() : test(nullptr) {}; PyObject(const PyObject &p) { if (p.test) { test = new Derived(new PyObject(p)); test->is_owning = false; } else { test = nullptr; } } PyObject(PyObject &&p) noexcept { test = p.test; p.test = nullptr; test->is_owning = false; //???? } PyObject &operator=(const PyObject *p) // 拷贝赋值运算符 { if (this != p) { // if (test && test->is_owning) // delete test; test = p->test; if (test) { cout << "PyObject got a value" << endl; cout << "Borrowing" << endl; } } return *this; } template PyObject &operator=(T &&t) noexcept { // if (test && test->is_owning) // delete test; cout << "PyObject got a value" << endl; test = new Derived(new T(forward(t))); test->is_owning = true; // typedef typename std::remove_cv::type>::type RawT; cout << "Owning" << endl; return *this; } template PyObject &operator=(T &t) { // if (test && test->is_owning) // delete test; this->test = new Derived(new T(t)); cout << "PyObject got a value" << endl; test->is_owning = false; cout << "Borrowing" << endl; return *this; } PyObject &operator=(char c) { this->c = c; return *this; } operator char() const { return c; } operator double() const { return d; } operator int() const { return i; } template operator const T &() const { return *dynamic_cast *>(test)->data; } ~PyObject() { if (test && test->is_owning) { delete test; } } };