私は C++11 のスマート ポインターにかなり慣れていないので、プロジェクトで効果的に使用しようとしています。私のプロジェクトでは、次のように、vector
ofへの const 参照を取り、unique_ptr
それに対していくつかの計算を行い、いくつかの結果を戻りパラメーターに配置する多くの関数があります。
void computeCoefficients(const vector<unique_ptr<Scalar>>& roots,
vector<unique_ptr<Scalar>>& coeffs) {
...
}
私が使用してunique_ptr
いるのは、これらすべての関数を呼び出すプロシージャが 内のオブジェクトの唯一の所有者でvector
あり、関数がオブジェクトを入力として読み取るためにオブジェクトを「借用」しているだけだからです。
今、私は受け取った のさまざまなサブセットで計算を行う関数を作成しようとしています。そのためには、 を受け取るさらに別の関数に渡すために、それらのサブセットを含むvector
のさまざまな「バージョン」が必要です。入力として。しかし、ベクトルのサブセットを取得する唯一の方法は、そのコピーを作成することです。s はコピーできないため、これは問題です。コードを次のようにしたいと思います。vector
vector<unique_ptr<Scalar>>
unique_ptr
void computeOnSet(const vector<unique_ptr<Scalar>>& set, unique_ptr<Scalar>& output) {
...
}
void computeOnAllSubsets(const vector<unique_ptr<Scalar>>& set, vector<unique_ptr<Scalar>>& outputs) {
for(int i = 0; i < input.size(); i++) {
auto subset = vector<unique_ptr<Scalar>>(set.begin(), set.begin()+i);
subset.insert(subset.end(), set.begin()+i+1, set.end();
computeOnSubset(subset, outputs.at(i));
}
}
もちろん、それはうまくいきません。unique_ptr
s をsに置き換えれば動作させることができますshared_ptr
が、これには 2 つの問題があります。
- 哲学的には、セットの所有権を関数と共有していることを意味し
computeOnSubsets
ますが、そうではありません。呼び出し元はまだ唯一の所有者です。(これshared_ptr
は、コピーを持つすべてのものと所有権を共有していることを意味します)。 - すべてのメソッドの入力パラメーターを
vector<shared_ptr<Scalar>>
.
私がやりたいことは、一時的な読み取り専用のサブベクトルを作成するためだけに、ポインターの一時的な読み取り専用のコピーを作成することだけです。これを行う方法はありますか?私が必要としているもののように聞こえますが (非所有の一時ポインター)、それは でのみ使用できます。weak_ptr
shared_ptr