如果我有一个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]
,因为它只有 type ,并且拥有一个采用该类型的隐式构造函数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[]
没有标准化,所以我想自己定义。不幸的是,我认为这实际上是不可能的,它不会破坏别名构造函数的内部结构,因为它试图将 mystd::shared_ptr<T[]>
转换为它自己的特定于实现的超类型,这不再可能。(我的目前只是从 boost 继承。)这个想法的好处是我可以实现我的实例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);
其他人有什么想法吗?