Я пытаюсь определить существующий код, который использует члены данных «pimpl» для определения с помощью unique_ptr. Некоторые объекты требуют пользовательского удаления, а другие нет.std :: unique_ptr для элемента данных класса ABI (Ипподром Pimpl)
unique_ptr (в отличие от shared_ptr) destructor требует знания полного типа объекта. Таким образом, вы должны указать Deleter в объявлении члена данных:
class Foo {
public:
...
~Foo (void) //in source file =default
private:
class FooImpl;
std::unique_ptr <FooImpl> _pimpl;
};
Когда инстанцированию Pimpl вы ограничены в использовании Deleter по умолчанию. Если вы хотите пользовательский Deleter, необходимо указать его в декларации
class Foo {
public:
...
~Foo (void) //in source file =default
private:
class FooImpl;
std::unique_ptr <FooImpl, std::function <void (FooImpl*&)> > _pimpl;
};
Однако, вы не можете иметь возможность быть гибкими, хотите ли вы unique_ptr d'Tor с поведением по умолчанию или пользовательские Deleter. Более гибкий вариантом является вторым вариантом, но если вы хотите сохранить с поведением по умолчанию, то вы должны создать экземпляр unique_ptr с определенным Deleter, что эквивалентно по умолчанию удалить, например:
Foo::Foo (void) :
_impl (new CurveItemWidgetImpl, std::default_delete <FooImpl>()) {
}
Итак, std :: unique_ptr лучший способ обработки ABI (по сравнению с shared_ptr или raw pointer)?
Не используйте 'std :: function' как' unique_ptr' deleter. Его конструктор может бросить. –
@ T.C, можете ли вы дать другой способ обобщить делетера? – chook
* Почему бы вам не хотеть ничего, кроме 'default_delete', как' pImpl' deleter? – ecatmur