gpt4 book ai didi

c++ - shared_array 的元素作为 shared_ptr?

转载 作者:可可西里 更新时间:2023-11-01 17:59:38 25 4
gpt4 key购买 nike

如果我有一个 boost::shared_array<T> (或 boost::shared_ptr<T[]> ),有没有办法获得 boost::shared_ptr<T>哪个与数组共享?

例如,我可能想写:

shared_array<int> array(new int[10]);
shared_ptr<int> element = &array[2];

我知道我不能使用 &array[2] ,因为它只有类型 int * , 这对 shared_ptr<int> 是危险的有一个将采用该类型的隐式构造函数。理想shared_array<int>上面会有一个实例方法,比如:

shared_ptr<int> element = array.shared_ptr_to(2);

很遗憾,我找不到这样的东西。 shared_ptr<int> 上有一个别名构造函数这将与另一个 shared_ptr<T> 别名, 但它不允许使用 shared_array<T> 别名;所以我也不能写这个(它不会编译):

shared_ptr<int> element(array, &array[2]);
//Can't convert 'array' from shared_array<int> to shared_ptr<int>

我使用的另一个选项是使用 std::shared_ptr<T> ( std 而不是 boost )。 T[] 的特化没有标准化,所以我想自己定义它。不幸的是,我认为这实际上不可能以不破坏别名构造函数内部结构的方式实现,因为它试图转换我的 std::shared_ptr<T[]>。到它自己的特定于实现的父类(super class)型,这不再是可能的。 (我的目前只是继承自 boost one。)这个想法的好处是我可以实现我的实例 shared_ptr_to方法。

这是我试验过的另一个想法,但我认为它不够有效,无法接受我们可能会在整个大型项目中使用的东西。

template<typename T>
boost::shared_ptr<T> GetElementPtr(const boost::shared_array<T> &array, size_t index) {
//This deleter works by holding on to the underlying array until the deleter itself is deleted.
struct {
boost::shared_array<T> array;
void operator()(T *) {} //No action required here.
} deleter = { array };
return shared_ptr<T>(&array[index], deleter);
}

接下来我要尝试的是升级到 Boost 1.53.0(我们目前只有 1.50.0),使用 shared_ptr<T[]>而不是 shared_array<T> , 并且总是使用 boost而不是 std (即使对于非数组)。我希望这会奏效,但我还没有机会尝试:

shared_ptr<int[]> array(new int[10]);
shared_ptr<int> element(array, &array[2]);

当然,我仍然更喜欢实例方法语法,但我想我运气不好(没有修改 Boost):

shared_ptr<int> element = array.shared_ptr_to(2);

还有其他人有什么想法吗?

最佳答案

你在做奇怪的事情。为什么需要 shared_ptr到元素?您是否希望将数组的元素传递到其他地方并阻止删除您的数组?

如果是,则比 std::vector<shared_ptr<T>>更适合那个。该解决方案是安全的、标准的并且在对象移除方面具有细粒度

关于c++ - shared_array 的元素作为 shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15549413/

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