C++ 17。
template<auto X> using constant_t=std::integral_constant<std::decay_t<decltype(X)>, X>
template<auto X> constexpr constant_t<X> constant{};
template<class T, auto dtor> using smart_unique_ptr=std::unique_ptr< T, constant_t<dtor> >;
現在,假設你有一個C API包裝Bob
與Bob* createBob(some_args...)
和destroyBob(Bob*)
:
using unique_bob=smart_unique_ptr< Bob, destroyBob >;
unique_bob make_unique_bob(some_args args){
return unique_bob(createBob(args));
}
一個unique_bob
可以隱式移入shared_ptr<Bob>
。
額外假設的位可以使C++ 14此項工作:
template<class T, void(*dtor)(T*)> using smart_unique_ptr=std::unique_ptr< T, std::integral_constant<decltype(dtor),dtor> >;
其假設析構函數簽名是void(T*)
。
在C++ 11中,您必須編寫一個新的無狀態函數指針調度程序,用於零開銷unqiue ptrs。
爲什麼你需要在你的課堂參考計數器?只需在構造函數中調用createObject,在析構函數中銷燬並提供一些靜態工廠函數,該函數將返回指向您的類的智能指針。智能指針將處理refcounter部分。當你的類最終被破壞時 - 它會自動調用destroy –
createObject返回什麼?需要做些什麼?根據你的答案,可以有改進。 – Yakk