- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试定义现有代码,这些代码使用要用 unique_ptr 定义的“pimpl”数据成员。有些对象需要自定义删除器,有些则不需要。
unique_ptr(与 shared_ptr 不同)析构函数需要知道对象的完整类型。所以需要在数据成员声明中指定删除器:
class Foo {
public:
...
~Foo (void) //in source file =default
private:
class FooImpl;
std::unique_ptr <FooImpl> _pimpl;
};
在实例化 pimpl 时,您只能使用默认删除器。如果你想要一个自定义的删除器,你需要在声明中指定它
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 还是自定义删除器,您都无法灵活选择。更灵活的选项是第二个版本,但如果您选择保持默认行为,则必须使用等同于默认删除的特定删除器实例化 unique_ptr,例如:
Foo::Foo (void) :
_impl (new CurveItemWidgetImpl, std::default_delete <FooImpl> ()) {
}
那么,std::unique_ptr 是处理 ABI 的最佳方式吗(与 shared_ptr 或原始指针相比)?
最佳答案
您可以轻松提供有效调用不透明符号的删除器:
class Foo {
public:
~Foo(); // = default
private:
class FooImpl;
struct FooImplDelete { void operator()(FooImpl*); };
std::unique_ptr<FooImpl, FooImplDelete> _pimpl;
};
现在您可以将 Foo::FooImplDelete::operator()
的定义移动到您的源文件中。实际上,优化编译器会将其内联到 Foo
的析构函数中。
如果您没有特别的理由怀疑需要自定义删除器,您也可以使用默认的;如果您需要将自定义删除器更改为 release
unique_ptr
:
Foo::Foo() try
: _pimpl(new FooImpl)
{
}
catch(...)
{
delete _pimpl.release();
}
Foo::~Foo()
{
delete _pimpl.release();
}
关于c++ - 类数据成员 ABI 的 std::unique_ptr(Pimpl 习惯用法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30072094/
我编写的代码主要供个人使用,但我正在考虑发布我最初开发供个人使用的应用程序(科学模拟/可视化)。 我的一个习惯是在类中使用一个main方法来单独测试类的运行情况。我认为这在某种程度上可能是不好的(毫无
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do I convince programmers in my team to do TDD? 在从
假设我想测试是否有一个名为“Z”的驱动器。第一步是这样的; Get-PSProvider | Select-Object -Property Drives 这个给我; Drives: ... {C,
这是对 an old answer to a question about the necessity of functools.partial 的一种跟进: 虽然这个答案非常清楚地解释了这种现象及其
Perl 习惯很难改掉。两种语言之间的变量声明、作用域、全局/局部是不同的。是否有一组推荐的 python 语言习语可以使从 perl 编码到 python 编码的过渡不那么痛苦。 细微的变量拼写错误
我是一名优秀的程序员,十分优秀!