gpt4 book ai didi

c++ - 使用 std::unique_ptr 的 std::unordered_set

转载 作者:IT老高 更新时间:2023-10-28 12:55:58 26 4
gpt4 key购买 nike

假设我有一组 unique_ptr:

std::unordered_set <std::unique_ptr <MyClass>> my_set;

我不确定检查集合中是否存在给定指针的安全方法是什么。正常的做法可能是调用my_set.find(),但是我要传递什么作为参数呢?

我从外部得到的只是一个原始指针。所以我必须从指针创建另一个 unique_ptr,将它传递给 find() 然后 release() 该指针,否则对象将被破坏(两次)。当然,这个过程可以在一个函数中完成,所以调用者可以传递原始指针,我来做转换。

这种方法安全吗?有没有更好的方法来处理一组 unique_ptr?

最佳答案

您也可以使用不执行任何操作的删除器。

template<class T>
struct maybe_deleter{
bool _delete;
explicit maybe_deleter(bool doit = true) : _delete(doit){}

void operator()(T* p) const{
if(_delete) delete p;
}
};

template<class T>
using set_unique_ptr = std::unique_ptr<T, maybe_deleter<T>>;

template<class T>
set_unique_ptr<T> make_find_ptr(T* raw){
return set_unique_ptr<T>(raw, maybe_deleter<T>(false));
}

// ...

int* raw = new int(42);
std::unordered_set<set_unique_ptr<int>> myset;
myset.insert(set_unique_ptr<int>(raw));

auto it = myset.find(make_find_ptr(raw));

Live example.

关于c++ - 使用 std::unique_ptr 的 std::unordered_set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17851088/

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