そのため、オブジェクトに共有リソースへの参照を持たせたい場合があります (タイプの何かとしましょうA
) 。A
さらに、オブジェクト自体がコンテナー ( vector
、list
、set
) の内部に挿入され、操作される場合があります。
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;
};
これは素晴らしいことです。私が探しているのは、私が呼び出すクラスを実装する方法ですRefersAnA
。RefersAnA
aがそれ自身の 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 つのポインターが必要です。