0

次のように、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

4

2 に答える 2

2

ハンドルを CEvent に shared_ptr として格納する必要はありません。ハンドルは既に CHandleT 属性を介して共有されています。

CEvent 要素を CHandleT 要素として (ポリモーフィズムを使用して) 使用したくない限り、構成は問題ありません。

于 2009-11-09T21:52:57.027 に答える