次のように、boost::shared_ptr<> を使用して Win32 HANDLE を管理するための C++ RAII クラスがあります。
namespace detail {
struct NoDelete { void operator()( void* ) {}; };
}; // namespace detail
template< typename HANDLE_TYPE, typename HANDLE_DELETER >
class CHandleT
{
public :
explicit CHandleT( HANDLE_TYPE handle, bool delete_on_release = true )
{
if( delete_on_release )
handle_ = Handle( handle, HANDLE_DELETER() );
else
handle_ = Handle( handle, detail::NoDelete() );
};
operator HANDLE_TYPE() const { return static_cast< HANDLE_TYPE >( handle_.get() ); };
protected:
typedef boost::shared_ptr< void > Handle;
Handle handle_;
}; // class CHandleT
struct DeallocateHandle
{
void operator()( void* handle ) { ::CloseHandle( handle ); };
};
typedef CHandleT< HANDLE, DeallocateHandle > CHandle;
代わりに次のように拡張したいと思います。
CHandle my_handle( ::CreateEvent( NULL, FALSE, FALSE, NULL ) );
::SetEvent( my_handle.get() );
私は書くことができます:
CEvent my_event( NULL, FALSE, FALSE, NULL );
my_event.SetEvent();
CHandle クラスを CEvent クラスのメンバーとして使用するのが最善の方法でしょうか?
class CEvent
{
public:
explicit CEvent( LPSECURITY_ATTRIBUTES lpEventAttributes = NULL,
BOOL bManualReset = TRUE,
BOOL bInitialState = FALSE,
LPCTSTR lpName = NULL,
bool delete_on_release = true ) :
handle_( new CHandle( ::CreateEvent( lpEventAttributes,
bManualReset,
bInitialState,
lpName ),
delete_on_release ) )
{
};
BOOL SetEvent()
{
_ASSERT( NULL != handle_ && NULL != handle_.get() );
return ::SetEvent( handle_.get() );
};
private:
boost::shared_ptr< CHandle > handle_;
}; // class CEvent
または、より良い方法はありますか?(boost::shared_ptr<> によって指定された CHandle のコピー セマンティクスを維持したいことに注意してください。
ありがとう、ポールH