首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HippoMocks -模拟返回unique_ptr的函数

HippoMocks -模拟返回unique_ptr的函数
EN

Stack Overflow用户
提问于 2013-03-01 22:51:53
回答 1查看 1.5K关注 0票数 6

我目前还没有成功地模拟一个返回unique_ptr的接口。例如,给定

代码语言:javascript
复制
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的副本

代码语言:javascript
复制
Call &Return(Y obj) { retVal = new ReturnValueWrapper<Y>(obj); return *this; }

并且期望尝试返回unique_ptr

代码语言:javascript
复制
template <typename Z>
Z MockRepository::DoExpectation(base_mock *mock, std::pair<int, int> funcno, const base_tuple &tuple)
{
    ...
    return ((ReturnValueWrapper<Z> *)call->retVal)->rv;
}

按照for a similar problem with returned references的建议,我已经尝试过Do

我也尝试过编写自己的ValueWrapper<T>来生成unique_ptr,但是在某个地方,值总是被复制。现在我已经没有点子了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-02 01:12:30

该问题的一种解决方案是创建一个带有附加方法的派生接口,该方法将返回值作为临时

代码语言:javascript
复制
template <class T>
class TypedReturnValueHolder : public ReturnValueHolder {
public:
    virtual T rv() = 0;
};

他们修改原始的ReturnValueHolder

代码语言:javascript
复制
template <class T>
class ReturnValueWrapper : public ReturnValueHolder {
public:
typename no_cref<T>::type rv;
ReturnValueWrapper(T rv) : rv(rv) {}
};

继承并实现派生接口。

代码语言:javascript
复制
template <class T>
class ReturnValueWrapper : public TypedReturnValueHolder<T> {
    typename no_cref<T>::type prv;
public:
    ReturnValueWrapper(T rv) : prv(rv) {}
    virtual T rv() { return prv; };
};

完成此操作后,从DoExpectation返回的内容可以编写为

代码语言:javascript
复制
        if (call->retVal)
            return ((TypedReturnValueHolder<Z> *)call->retVal)->rv();

问题中的示例在重写为使用Do

代码语言:javascript
复制
mocks.OnCall( foo, IFoo::foo )
     .Do( [](){ return std::unique_ptr<IFoo>(); } );

然后按照预期进行编译和运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15160565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档