3

私は最近、さまざまなスマート ポインター型について読みましたが、特に unique_ptr は非常に有用であり、shared_ptr と weak_ptr もある程度役立つと思います。ただし、いずれかのポインター型を処理できる「汎用」関数を作成する方法と、それが良いアイデアであるかどうかはわかりません。

スマート ポインターによってカプセル化されたオブジェクトのベクトルがあり、関数を使用してすべての要素に何らかのアクションを適用したいとします。たとえば、次のようになります。

void doSomething(vector<shared_ptr<SomeType>>& array) {
   // iterate over all array elements and do something
}

明らかに、この関数を shared/unique/weak_ptr に対して 3 回複製する必要がありますが、これはやや面倒です。関数パラメーターの使用法にすべて適合する「ジェネリック」/「ポリモーフィック」スマートポインタータイプを使用する方が簡単です。

void doSomething(vector<generic_ptr<SomeType>>& array) {
   // iterate over all array elements and do something
   // no matter if array is a vector<shared_ptr> or vector<unique_ptr>
}

では、そのようなスマートポインターは存在するのでしょうか? はいの場合 - その使用によりどのような問題が発生する可能性がありますか? いいえの場合 - なぜですか?

4

4 に答える 4

4

ポインターの型が異なると、必要なランタイム オーバーヘッドが異なる、異なる所有権の処理が可能になります。あなたの場合、テンプレートを使用できます:

template<typename TVector>
void doSomething(TVector& array) {
   // iterate over all array elements and do something
}

そして、スマートな(そしてそれほどスマートではない)ポインターのすべてに共通を使用しoperator*operator->

于 2013-04-23T08:12:38.127 に答える
0

これらの各スマート ポインター型には、onw 使用モデルがあります。

  • unique_ptr はコンテナーに入れることができません。コピー可能でもコピー代入可能でもありません。

  • 参照されるオブジェクトにアクセスするには、weak_ptr を shared_ptr に変換する必要があります。たとえば、キャッシュに使用できますが、あらゆる場所で使用するのは面倒です。

  • shared_ptr はあなたの状況で行く方法です

于 2013-04-23T08:16:42.397 に答える
0

これらのポインター型はすべて、実際にはそのままのポインターをラップします。したがって、次の 2 つのケースがあります。

  1. あなたのメソッドは何らかの方法でポインターを変更します。この場合、タイプによってケースが異なるため、一般化することはできません。

  2. ポインターを変更することはありません。const ベア ポインタを関数に渡すだけです。

于 2013-04-23T08:15:42.350 に答える