В этом вопросе я спросил "pimpl: shared_ptr или unique_ptr" Я был убежден, что правильное использование идиомы pimpl - это использование unique_ptr
, а не 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) остались прежними).