1. ホーム
  2. c++

[解決済み] std::unique_ptr の受け渡し方法は?

2023-03-12 13:03:30

質問

C++11に初めて挑戦しています。 unique_ptr このポインターは 1 つのクラスによって所有されていますが、非常に頻繁に渡されています。

以前はこんな関数がありました。

bool func(BaseClass* ptr, int other_arg) {
  bool val;
  // plain ordinary function that does something...
  return val;
}

しかし、すぐに切り替えができないことに気がつきました。

bool func(std::unique_ptr<BaseClass> ptr, int other_arg);

なぜなら、呼び出し側が関数へのポインタの所有権を処理しなければならないからです。そこで、私の問題に対する最良の解決策は何でしょうか?

私はこのように、ポインタを参照として渡すことを考えました。

bool func(const std::unique_ptr<BaseClass>& ptr, int other_arg);

しかし、私はそうすることに非常に違和感を覚えます。なぜなら、まず、すでに _ptr として型付けされたものを参照として渡すのは、直感的ではないと思われるからです。第二に、関数のシグネチャがさらに大きくなってしまうからです。第三に、生成されたコードでは、私の変数に到達するために2つの連続したポインタの間接参照を必要とするためです。

どのように解決するのですか?

関数にポインタを使わせたい場合は、ポインタの参照を渡します。ある種のスマートポインタでしか動作しないように関数を縛る理由はありません。

bool func(BaseClass& base, int other_arg);

また、コールサイトでは operator* :

func(*some_unique_ptr, 42);

あるいは、もし base 引数に null を指定できる場合は、署名をそのままにして get() メンバ関数を使用します。

bool func(BaseClass* base, int other_arg);
func(some_unique_ptr.get(), 42);