Как я должен обернуть библиотеки C в C++

Типичные библиотеки 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() );
}

Прямо сейчас я использую второе решение, но в основном потому, что мне лень писать все функции-члены. Есть ли причина, по которой один метод действительно предпочтительнее другого?

1 ответ

Решение

Первый подход - это больше C++ способ делать вещи. Все функции сгруппированы в одну логическую единицу (класс), вы инкапсулировали данные, чтобы RAII предотвращал утечку ресурсов, и вам удалось отбросить foo_ префикс тоже!

Другие вопросы по тегам