現在、unique_ptr< Interface >&&
コンストラクターでを受け入れるテスト中のクラスがあり、インターフェイス実装の単一の所有権を取得したいことを表現しています。ただし、モックを使用してこのクラスをテストする場合は問題が発生しInterface
ます。モックフレームワーク(HippoMocks)は、私Interface*
が所有していないものだけを提供するため、削除できません。
以前、const shared_ptr< Interface >&
引数としてクラスをテストするときに同じ問題が発生しましたが、カスタムのno-opdeleterを提供することで問題を修正しました。
template< class T >
void NoDelete( T* )
{
}
//create a shared_ptr without effective deleter
template< class T >
std::shared_ptr< T > mock_shared( T* t )
{
return std::shared_ptr< T >( t, NoDelete< T > );
}
Interface* iface = mocks.GetMeAMock< Interface >();
DoStuffWithSharedPtrOfInterface( mock_shared< Interface >( iface ) );
削除者はテンプレート引数であるため、unique_ptrの同様の修正は実際には機能しません。
template< class T >
struct NoDelete
{
void operator ()( T* )
{
}
};
//oops this is totally useless since std::unique_ptr< T, NoDelete< T > >
//is not quite the same type as std::unique_ptr< T >
template< class T >
std::unique_ptr< T, NoDelete< T > > mock_unique( T* t )
{
return std::unique_ptr< T, NoDelete< T > >( t, NoDelete< T >() );
}
これに対する回避策はありますか?または、そもそもここでunique_ptrを使用するべきではありませんか?
更新 私はこれを試してみました。動作するはずですが、sizeof(ptr)は8になり、どのような影響があるかを判断するのは困難です。
//use CustomUniquePtr::type instead of uniqe_ptr
template< class T >
struct CustomUniquePtr
{
typedef typename std::unique_ptr< T, void (*) ( T* ) > type;
}
//use everywhere
template< class T >
CustomUniquePtr< T >::type make_unique( T* p )
{
return CustomUniquePtr< T >::type( p, Delete< T > );
}
//use when mocking, doe not delete p!
template< class T >
CustomUniquePtr< T >::type mock_unique( T* p )
{
return CustomUniquePtr< T >::type( p, NoDelete< T > );
}