典型的C庫是這樣的:我應該如何包裝的C庫爲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;
,並直接使用C接口。
int main()
{
foo_ptr my_foo(foo_open());
foo_query(my_foo.get());
}
現在,我正在使用第二種解決方案,但主要是因爲我懶得編寫所有的成員函數。有一個原因是爲什麼一種方法應該比另一種方法更受歡迎?
檢查此建議:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3677.html是否有意向標準庫添加通用RAII-wrappers。它可以給你一些想法。 – Manu343726
另請參閱:http://flamingdangerzone.com/cxx11/2012/08/15/rule-of-zero.html –