unique_ptrはupかuに
A* _a; A* _a = new A(1,"abc"); - - - - - unique_ptr<A> _a; unique_ptr<A> _a = unique_ptr<A>(new A(1,"abc")); V.S. up<A> _a; up<A> _a = new_up<A>(1,"abc"));
頻繁に使うものは簡潔な表記でなければならない
C++11で導入されたunique_ptrですがポインタの代わりに使うには余りにも大きな障害があります。
表記が長すぎるのです。
// ポインタ A* _a = new A(1,"abc"); // 同じことをunique_ptrで書くと std::unique_ptr<A> _a = std::unique_ptr<A>(new A(1,"abc"));
いくら自動消去機能を持つとはいえ、 ポインタの代わりにこんな長ったらしい表記が導入できる訳がありません。
usingを使いautoを使って
auto _a = unique_ptr<A>(new A(1,"abc"));
それでも長い。
C++14で導入されるmake_uniqueを用いれば
auto _a = make_unique<A>(1,"abc"));
それでも何度もあちらこちらで書く気にはならない。
て、ことで先の記事
値指向vectorをunique_ptrでオブジェクト指向っぽくする
に載せた短縮記述を改めて推奨します。
次のように記述できます。
up<A> _a; // 型 up<A> _a = new_up<A>(1,"abc")); // オブジェクトのnew auto _a = new_up<A>(1,"abc")); // autoも可
この記述を可能とする定義は次のものです。
template<typename T, typename... Args>
std::unique_ptr<T> new_up(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
template<typename T>
using up=std::unique_ptr<T>;
u<T>やp<T>も検討しました。
u<A> _a; // 型 u<A> _a = new_u<A>(1,"abc")); // オブジェクトのnew auto _a = new_u<A>(1,"abc")); // autoも可 p<A> _a; // 型 p<A> _a = new_p<A>(1,"abc")); // オブジェクトのnew auto _a = new_p<A>(1,"abc")); // autoも可
これもありかな。
ただshared_ptr,weak_ptrを考えるとup,sp,wpが適当とも考えます。
upの問題はup/downのupに見えること。
*とか++とか<P>とか
CにしろHTMLにしろ創始者の考えた簡潔な表記には感心します。
後を継ぐ「後付け原理主義者」達はどうして「簡潔な表記」を目の敵にするのでしょう?
| 固定リンク

