sách gpt4 ăn đã đi

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

In lại 作者:搜寻专家 更新时间:2023-10-31 02:10:44 26 4
mua khóa gpt4 giày nike

有智能指针类:

template 
class UniquePtr {
công cộng:
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;
}

riêng tư:
T* obj;
};

测试类:

lớp Kiểm tra {
công cộng:
Bài kiểm tra()
{
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&& ptr)
{
std::vector<>> v;
v.push_back(std::move(ptr));
}

如果我通过了测试课,一切就OK了:

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

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

class TestChild : public Test {
công cộng:
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 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可转换为 UniquePtr&&std::unique_ptr此代码有效。

câu trả lời hay nhất

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

template
UniquePtr(UniquePtr && 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/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress