この質問では、「pimpl: shared_ptr or unique_ptr」と尋ねました。pimpl イディオムの適切な使用法は、 aunique_ptr
ではなく aを使用することであると確信しましたshared_ptr
。ユーザーにはポインターがまったくないかのように動作する必要がありますが、shared_ptr
コピー時にエイリアシングが導入されることは明らかであり、これは間違いなくポインターのように動作します。
したがって、ユーザーがshared_ptr
私の pimpl オブジェクトに を作成したいとしましょう (実際に複数のエイリアスが必要な場合など)。例えば:
shared_ptr<my_pimpl> p(new my_pimpl());
それは私の実装を指すことになりますshared_ptr
。unique_ptr
次のようなものを達成できればいいのですが:
my_pimpl x; // (1)
shared_ptr<my_pimpl> p(new my_pimpl()); // (2) Pointer to pointer here.
x.f(); // (3)
p->f(); // (4)
しかし、どうにかしてポインタからポインタへのポインタを取り除き、pimpl の実装の非表示を維持します。
これを達成する方法についてのアイデア (行 (2) と明らかに変更できてうれしいですが、my_pimpl
行 (3) と (4) は同じままにしておきたい)。