C++ 如何将C库包装到C++;

C++ 如何将C库包装到C++;,c++,c,raii,C++,C,Raii,典型的C库如下所示: foo_t * foo_open(); int foo_query( foo_t * ); int foo_close( foo_t * ); 我可以看到两种方式将它们包装到sleak RAII结构中。我可以创建一个类并包装每个C函数: class foo { public: foo(): m_impl( foo_open() ) { } ~foo() noexcept { foo_close( m_impl ); } int query(

典型的C库如下所示:

foo_t * foo_open();
int     foo_query( foo_t * );
int     foo_close( foo_t * );
我可以看到两种方式将它们包装到sleak 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;

现在,我正在使用第二种解决方案,但主要是因为我太懒了,无法编写所有的成员函数。为什么一种方法真的应该是另一种方法?

< P>第一种方法是C++的做事方式。所有函数都被分组到一个逻辑单元(类)中,您已经封装了数据,这样RAII就可以防止资源泄漏,并且您还成功地删除了
foo\uu
前缀

检查此建议:打算将通用RAII包装添加到标准库中。另外,如果C库设计得很好,它的界面就不会经常改变,所以编写包装器只是一次性的工作。如果你不得不做很多这样的事情,你甚至可以把它自动化,只需要做一些手动调整。
int main()
{
    foo_ptr my_foo( foo_open() );
    foo_query( my_foo.get() );
}