c++ - 如何将我自己的智能指针传递给函数?

标签 c++ c++11 smart-pointers

有智能指针类:

template <typename T>
class UniquePtr {
public:
    UniquePtr(T* obj)
        : obj(obj)
    {
    }
    UniquePtr(const UniquePtr& ptr) = delete;
    UniquePtr(UniquePtr&& ptr)
    {
        std::cout << "!! use of move !!" << std::endl;
        obj = std::move(ptr.obj);
        ptr.obj = nullptr;
    }

    UniquePtr& operator=(const UniquePtr& ptr) = delete;
    UniquePtr& operator=(const UniquePtr&& ptr) = delete;

    ~UniquePtr()
    {
        delete obj;
    }

private:
    T* obj;
};

测试类:

class Test {
public:
    Test()
    {
        std::cout << "Test is created" << std::endl;
    }
    Test(const Test& obj) = delete;
    Test(const Test&& obj) = delete;
    Test& operator=(const Test& obj) = delete;
    Test& operator=(const Test&& obj) = delete;
    virtual ~Test()
    {
        std::cout << "Test is destructed" << std::endl;
    }
};

及功能:

void function(UniquePtr<Test>&& ptr)
{
    std::vector<UniquePtr<Test>> v;
    v.push_back(std::move(ptr));
}

如果我通过了测试类(class),则一切正常:

UniquePtr<Test> ptr(new Test);
function(std::move(ptr));

但是如果我通过从 Test 类派生的代码,则不会编译代码:

class TestChild : public Test {
public:
    TestChild()
    {
        std::cout << "Test child is created" << std::endl;
    }
    TestChild(const TestChild& obj) = delete;
    TestChild(const TestChild&& obj) = delete;
    TestChild& operator=(const TestChild& obj) = delete;
    TestChild& operator=(const TestChild&& obj) = delete;
    virtual ~TestChild()
    {
        std::cout << "Test child is destructed" << std::endl;
    }
};
UniquePtr<TestChild> ptr(new TestChild);
function(std::move(ptr));
error: invalid initialization of reference of type ‘UniquePtr&&’ from
expression of type ‘std::remove_reference&>::type {aka UniquePtr}’
function(std::move(ptr)); ~~~~~~~~~^~~~~

我怎样才能制作UniquePtr<TestChild>可转换为UniquePtr<Test>&&std::unique_ptr这段代码有效。

最佳答案

很像 std::unique_ptr handles it ,您需要为您的类提供一个模板化构造函数,该构造函数采用 UniquePtr不同类型的(允许 SFINAE 处理继承检查),然后它将用于初始化您的 UniquePtr的状态。

template<typename U>
UniquePtr(UniquePtr<U> && other) {
    obj = other.obj;//Won't compile if U is not a subclass of T.
    other.obj = nullptr;
}

关于c++ - 如何将我自己的智能指针传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44806925/

相关文章:

c++ - QTextEdit中的 "selection"和 "cursor"有什么区别?

c++ - std::function 与 lambda 的比较

c++ - “嵌套”模板 `>>` 问题已解决。 `<::` 呢?

c++ - 这个 OpenCV 库中如何使用 union ?

java - 如何使用 Opencv 将 PNG 从 Java 类传递到 Android 中的 Native 类

c++11如何将十六进制字符串转换为unicode字符串

c++ - 跨编译器的浮点文字到 IEEE-754 二进制模式的一致性

C++ 智能指针范围和资源删除

c++ - enable_shared_from_this - 空的内部弱指针?

c++ - unique_ptr 可以在不泄漏内存的情况下与负索引一起使用吗?