質問

リソース処理を簡素化するために、Unique_PTRを使用してポインタを使用してソリューションを移行しようとしています。私は、移動セマンティクスとUnique_PTRで動作するためのstd::move()の使用を認識しています。

現在、私は署名int foo(const T2DMatrix* m)を持つ関数を持っていて、私は動的に割り当てられた2D-Matrixオブジェクトを使用してこれを呼び出します。関数fooには、T2DMatrixクラス、したがってconst引数への読み取り専用アクセスのみが必要です。さて、私はこれをint foo(unique_ptr<const T2DMatrix>& m)に移行しました。異なる機能から、process()オブジェクト(ファクトリ関数を使用して作成された)を持つunique_ptr<T2DMatrix>から、オブジェクトをfooに渡します。ただし、コンパイラは私がそうすることを許可しません。注意してください。オブジェクトの所有権をprocess()からfoo()、したがって参照の使用を転送したくありません。 unique_ptr<const T2DMatrix>を使用してFOO()を呼び出すと、関数の署名を変更するとConst保証は適用されません。

注:PROCESS()に新しいunique_ptr<const T2DMatrix>オブジェクトを作成し、unique_ptr<T2DMatrix>を使用してOriginal std::move()オブジェクトから所有権を転送することで、Foo()に渡し、再度PROCESS()で所有権を転送します。 。しかしこれは理想的な解決策のように思えます。

POINTERソリューションと同等のものをお勧めします。これにより、T2DMATRIX *引数をconst t2dmatrix *パラメーターに渡すことができます。 MSVC2012、MSVC2013、およびG ++ 4.8を使用して同じ結果を得てみました。

役に立ちましたか?

解決

関数が所有権を必要としない場合は、unique_ptr

への参照ではなく平文を渡します。
int foo(T2DMatrix const& m);


std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);
.

関数が所有権を気にしない場合は、fooを人工的に制約する必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top