gpt4 book ai didi

C++11 将 unique_ptr 转换为基类

转载 作者:行者123 更新时间:2023-11-30 02:34:12 26 4
gpt4 key购买 nike

我有一个函数,它接受一些对象 vector 并对其进行过滤,并且需要返回转换为基类的过滤后的对象 vector 。

class Base {
// stuff
}

class Derived : public Base {
// more stuff
}

// elsewhere...
vector<reference_wrapper<const unique_ptr<Base>>> do_something(const vector<unique_ptr<Derived>> &things) {
vector<reference_wrapper<const unique_ptr<Base>>> a;

for (const unique_ptr<Derived> &derived : things) {
if (check(derived)) {
a.push_back(derived); // this obviously doens't work -
// what should I put here?!

// this does not work:
// a.push_back(std::ref(derived.get()))
// because derived.get() is an rvalue
}
}

return a;
}

返回的 vector 不拥有任何原始对象——它们应该只是读者。原始对象的生命周期将超过返回 vector 的生命周期。

最佳答案

我还没有看过评论,所以可能已经有人回答了。然而,通常当 vector 不拥有任何它指向的成员时,不使用对 unique_ptr 的引用。 -- 正如这所表达的, vector 应该能够用 unique_ptr 做某些事情只有所有者可以。

完整的观察者的常用方法是使用原始指针(至少直到 observer_ptr 出现在标准库中)。约束是你永远不能调用 delete或对这些指针进行任何其他与内存相关的操作(这是 observer_ptr 在设计上不允许的操作)。

所以你写:

auto do_something(vector<unique_ptr<Derived>> const&things)
{
vector<Base *> a;

for (auto& derived : things) {
if (check(derived))
{
a.push_back(derived.get());
}

return a;
}

与您选择对 const unique_ptr 的引用的案例的简短比较: 可调用 constunique_ptr interface 中发挥作用由 get() 给出, get_deleter()operator bool() .在这三个中,使用 vector<Base *>接近你失去打电话的可能性get_deleter() .然而,作为一个读者,几乎肯定不需要删除器。

Scott Meyer(和他的引用资料)给出了一个稍微相关的讨论,这里可能会有兴趣:http://scottmeyers.blogspot.de/2014/07/should-move-only-types-ever-be-passed.html

关于C++11 将 unique_ptr 转换为基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34671733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com