Если HANDLE является общедоступным типом, но тип, на который он указывает, не является, существует очень простой способ написать это:
template <typename T> struct unpointer { };
template <typename T> struct unpointer<T*> { typedef T type; };
boost::shared_ptr<typename unpointer<MYHANDLE>::type> my_handle(
CreateMyHandle(), &CloseMyHandle);
(Если вы используете действительно старую версию VC ++ илиgcc вы, вероятно, должны опустить "typename" там.)
Конечно, это становится немного многословным и утомительным.Если у вас есть только один тип дескриптора, вы, вероятно, напишите это:
typedef typename unpointer<MYHANDLE>::type MYHANDLEREF;
typedef boost::shared_ptr<MYHANDLEREF> my_shared_ptr;
Если у вас есть все виды дескрипторов для переноса (и так как похоже, что вы делаете Win32API, вы, вероятно, делаете), создайте шаблон, который упаковывает вещи на любом уровне, который вы предпочитаете (шаблон класса, который просто генерирует типы, handle_ptr<T>
, который подклассов shared_ptr<unpointer<T>>
и добавляет удаленный по умолчанию для вас, handle_ref<T>
который использует shared_ptr
за кулисами, чтобы имитировать MYHANDLE &
вместо того, чтобы имитировать то, на что MYHANDLE
указывает, и т. д.)