そのため、オブジェクトに共有リソースへの参照を持たせたい場合があります (タイプの何かとしましょう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。RefersAnAaがそれ自身の 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 つのポインターが必要です。