1

そのため、オブジェクトに共有リソースへの参照を持たせたい場合があります (タイプの何かとしましょA) 。A

さらに、オブジェクト自体がコンテナー ( vectorlistset) の内部に挿入され、操作される場合があります。

unique_ptrこれまでのところ、コンテナー内にあるポリモーフィック型がある場合は、の実装を使用したいと思うことがわかっています。したがって、HasAnAを所有するクラスAがコンテナ内に配置できる一方で、その が であることも許可Aされている場合B(Bこの場合は の派生クラスA)、次のようにする必要があります。

class A {
  virtual void a() { std::cout << "A" << endl; }
  payloadA payload;
}; 
class B: public A {
  void a() { std::cout << "A(B)" << endl; }
  void b() { std::cout << "B" << endl; }
  payloadB payload;
};
class HasAnA {
  std::unique_ptr<A> my_A; // this allows me to build a std::vector<HasAnA>
  OtherStuff my_other_stuff;
};

これは素晴らしいことです。私が探しているのは、私が呼び出すクラスを実装する方法ですRefersAnARefersAnAaがそれ自身の A の所有権を持つか、または他の何かが所有する A を参照するようにしたいと思います。

どれどれ。

class RefersAnA {
  std::unique_ptr<A> my_A; // represents my own A: when I die, this A is dealloc'd
  A* not_my_A;             // someone else's A. 
  OtherStuff my_other_stuff;
  RefersAnA () {
    // in here is code that would skip initializing my_A if a valid A* was provided.
  }
};

私にとって、これは私が望むほど友好的ではありません。「リソースへの一意のptrまたはリソースへの生のptrである」という概念を抽象化するある種のテンプレートクラスを作成できますか? 2 つのうちのどちらであるかを示すために 1 ビットと、1 つのポインターが必要です。

4

1 に答える 1

0

ここにアイデアがあります:

struct RefersOrOwns
{
    std::unique_ptr<T> own;
    T & ref;

    RefersOrOwns() : own(new T), ref(*own) { }

    RefersOrOwns(T & t) : ref(t) { }
};

(代わりにown(new T)私はもちろん を好みown(make_unique<T>())ますが、それは別の問題です。)

于 2012-10-29T22:37:51.750 に答える