我目前无法成功地模拟一个返回unique_ptr的接口。例如,给定以下代码:
struct IFoo {
virtual std::unique_ptr<IFoo> foo = 0;
};
int main()
{
MockRepository mocks;
auto foo = mocks.Mock<IFoo>();
mocks.OnCall( foo, IFoo::foo )
.Return( std::unique_ptr<IFoo>() );
}
这个无法编译,因为Return
实现会复制unique_ptr。
Call &Return(Y obj) { retVal = new ReturnValueWrapper<Y>(obj); return *this; }
期望返回unique_ptr
template <typename Z>
Z MockRepository::DoExpectation(base_mock *mock, std::pair<int, int> funcno, const base_tuple &tuple)
{
...
return ((ReturnValueWrapper<Z> *)call->retVal)->rv;
}
我已经尝试了建议中的Do
(类似返回引用的问题)。
我还尝试编写了自己的ValueWrapper<T>
,生成了一个unique_ptr,但是在某个地方值总是被复制。目前我已经没有更多想法了。
ReturnValueWrapper<std::unique_ptr<IFoo>>
编写一个专门化实现,以避免内部复制? - Arne Mertz