【发布时间】:2014-03-24 10:32:00
【问题描述】:
典型的 C 库如下所示:
foo_t * foo_open();
int foo_query( foo_t * );
int foo_close( foo_t * );
我可以看到有两种方法可以将它们包装成简洁的 RAII 结构。我可以创建一个类并包装每个 C 函数:
class foo
{
public:
foo(): m_impl( foo_open() ) { }
~foo() noexcept { foo_close( m_impl ); }
int query() { return foo_query( m_impl ) };
};
或者我可以使用带有自定义析构函数的智能指针:
class foo_destructor
{
public:
void operator()( foo_t * const obj ) noexcept
{
foo_close( obj );
}
};
typedef std::unique_ptr< foo_t, foo_destructor > foo_ptr;
直接使用C接口。
int main()
{
foo_ptr my_foo( foo_open() );
foo_query( my_foo.get() );
}
现在,我正在使用第二种解决方案,但主要是因为我懒得写所有的成员函数。有什么理由让一种方法真的比另一种更受欢迎吗?
【问题讨论】:
-
检查此提案:open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3677.html 打算将通用 RAII 包装器添加到标准库。它可以给你一些想法。