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> >;
现在假设你有一个Bob
用Bob* createBob(some_args...)
and包装的 C API destroyBob(Bob*)
:
using unique_bob=smart_unique_ptr< Bob, destroyBob >;
unique_bob make_unique_bob(some_args args){
return unique_bob( createBob(args) );
}
aunique_bob
可以隐式移动到 ashared_ptr<Bob>
中。
一些额外的假设可以使这项工作在 C++14 中工作:
template<class T, void(*dtor)(T*)> using smart_unique_ptr=std::unique_ptr< T, std::integral_constant<decltype(dtor),dtor> >;
假设 dtor 签名是void(T*)
.
在 C++11 中,您必须为零开销 unqiue ptrs 编写一个新的无状态函数指针调度程序。