*
生のポインターを使用するとスレッド セーフではない可能性があり、設計の意図 (オプションの値、所有権など) が明確ではないため、できればすべての生のポインターをコードから削除します。ただし、ポインターを使用しないのはそれほど簡単ではない場合もあります。たとえば、多相型のコンテナー内の基本型にポインターを使用する傾向があります。
class A : noncopyable { ... };
class B : public A { ... };
std::vector<A*> v;
v.emplace_back(new B);
// temporary container for some operation
std::vector<A*> selected;
if(check())
selected.emplace_back(v.front());
上記のコードについて何が言えますか? 所有者は誰ですか?それは共有所有権ですか?それが、おそらく次の場合に行うべき理由ですv
。
std::vector<std::unique_ptr<A>> v;
v.emplace_back(make_unique<B>());
がオブジェクトを所有していることは明らかですが、生のポインターがあり、デザインが直感的でなくなるのはv
まだ好きではありません。selected
標準C++ライブラリを見ると、仕事をすることができるタイプは1つだけだと思います - std::reference_wrapper :
std::vector<std::unique_ptr<A>> v;
v.emplace_back(make_unique<B>());
// temporary container for some operation
std::vector<std::reference_wrapper<A>> selected;
if(check())
selected.emplace_back(*v.front());
そのコードについてどう思いますか?それは良い習慣ですか?std::ref()
主にテンプレートを使用することを意図していることはわかってstd::cref
いますが、ここではそれを使用して、デザインの意図を明確に示すこともできるようです。私が目にする唯一の問題は、 を逆参照std::reference_wrapper
する必要get()
があり、. 似たようなものを自分で書くべきですか?それとも、将来の C++ バージョンでそのようなユースケースのために reference_wrapper を拡張できるのでしょうか? フィードバックをお寄せください。operator*()
operator->()
unique_ptr
編集:コードサンプルを変更して、意図をよりよく示すようにしました。