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[]
は標準化されていないので、自分で定義しようと思いました。残念ながら、エイリアシング コンストラクターの内部構造を壊さない方法でそれが実際に可能だとは思いませんstd::shared_ptr<T[]>
。これは、実装固有のスーパータイプに my をキャストしようとするためです。(私は現在、ブースト 1 から継承しているだけです。) このアイデアの良い点は、インスタンス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);
他に何かアイデアはありますか?