Как я должен обернуть библиотеки 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_
префикс тоже!