私はスマートポインタをさらに活用したいプロジェクトを持っているが保持していることが要求される「ポインタ」を返します。全体として、私はこの目標を達成しました。しかし、私は "ベストプラクティス"が何であるか分かりません。スマートポインタ
基本的に私は関数から "ポインタ"を返したいと思っていますが、には、ユーザがスマートポインタで保持しているが必要です。それだけでなく、特定のスマートポインタ(共有スコープとスコープスコープ)を強制したくありません。
scoped_ptr
をshared_ptr
(これは私が考える理想的な解決策になる)にアップグレードする適切な方法はないようです。私は彼らがなぜこれをしなかったのか理解しています。なぜなら、所有権の移転を許すので、std::auto_ptr
のようないくつかの問題につながる可能性があります。
しかし、の場合は、の場合は所有権の移転が良いようです。だから、私の考えでは、このようなものです:
// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
scoped_ptr
とshared_ptr
両方がstd::auto_ptr
から所有権を取るコンストラクタを持っているので、これが「OK」で動作します。
私の質問は、この良い習慣ですか?より良い解決策はありますか?
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
実際に私はそれがそれを得るためにいくつかの作業が必要だと思うことを除いても仕事ができる:唯一の真の選択肢は、私はこのような戻り値としてテンプレートテンプレートを使用している思い付くことができましたscoped_ptr
と一緒に作業してください。
思考?
シングルスレッドビルドのshared_ptrは、アトミックな参照カウントを使用しません。 –
そうですが、デフォルトではマルチスレッド版ではビルドが強化されています。 – Artyom
auto_ptrにscoped_ptrを使用する利点は、ポインタをコピーしないことを明確にしたい場合です。あなたは単にscoped_ptrですることはできません。あなたの意図がauto_ptrと所有権の移転と同じように、あなたの意図を伝えることです。 –