13

全体的なデザインをもう少し再考する必要があるかもしれませんが、現状では、次のようなことをしたいと思うかもしれません:

class A; 
class B;
std::map<boost::shared_ptr<const A>, B> APtrToBMap;

私はこれを試しましたが、単純なケースではうまくいくようです (コンパイラは文句を言わず、単純なテストはうまくいくようです)。しかし、私はこのアプローチについて考え直しています。そこには、私が気づいていない落とし穴がいくつかあると思います。

では、上記は実際的な意味で有効ですか?それとも、これを行うときに気付いていない欠陥がありますか?

4

4 に答える 4

24

リファレンスには次のように書かれています。

template<class T, class U>
  bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws

戻り値: 次のような不特定の値

  • operator< は、C++ 標準のセクション 25.3 [lib.alg.sorting] で説明されている厳密な弱い順序付けです。
  • operator<, !(a < b) && !(b < a) によって定義される等価関係の下では、2 つの shared_ptr インスタンスは、所有権を共有するか、両方が空である場合にのみ等価です。

スロー: なし。

注:連想コンテナーで shared_ptr オブジェクトをキーとして使用できるようにします。

于 2010-11-10T15:27:53.880 に答える
4

はい、共有ポインターを std::map のキーとして使用できますが、これは設計が壊れていることの確かな兆候です。いくつかのランダムなメモリ位置に従って順序付けられます。

あなたの質問は少しあいまいです。そのマップをどのように使用し、何をアーカイブしようとしているのかを言うと、より有用な回答が得られる可能性があります。

于 2010-11-10T16:40:06.017 に答える
0

これをboost::pythonと組み合わせて使用​​している場合は注意してください! Python からこれらの shared_ptr オブジェクトを渡すと、shared_ptr オブジェクトの比較に基づく C++ のすべての操作が失敗する可能性があります

于 2012-11-28T08:42:38.203 に答える
0

私は共有ポインタに 100% 精通しているわけではありませんが、元のポインタにアクセスする方法があれば、それをキーとして使用できます (何らかの理由でまだ心配な場合)。

于 2010-11-10T16:24:01.250 に答える