如何将C库包装成C++?

3

典型的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() );
}

目前,我正在使用第二种解决方案,但主要是因为我懒得编写所有成员函数。是否有理由真正偏好一种方法而不是另一种方法?


2
请查看此提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3677.html。该提案旨在向标准库中添加通用RAII包装器,可能会给您一些启示。 - Manu343726
参见:http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html - R. Martinho Fernandes
1个回答

5

第一种方法是更符合C++的做法。所有函数被分组到一个逻辑单元中(即类),你已经封装了数据,以避免RAII资源泄漏,并且你已经成功地删除了foo_前缀!


此外,如果C库设计良好,其接口不应经常更改,因此编写包装器只是一次性工作。而且,如果你必须做很多这样的工作,甚至可以自动化它,只需要进行一些手动调整即可。 - CompuChip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接