有一个正在测试的类当前unique_ptr< Interface >&&
在其构造函数中接受 a ,以表示它希望获得接口实现的单一所有权。当想要使用模拟来测试这个类时会出现问题Interface
:模拟框架(HippoMocks)只给我Interface*
我不拥有的,因此不能删除。
在测试作为参数的类之前,我遇到了同样的问题const shared_ptr< Interface >&
,但通过提供自定义无操作删除器解决了这个问题:
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 > );
}