gpt4 book ai didi

c++ - HippoMocks - 模拟一个返回 unique_ptr 的函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:53 25 4
gpt4 key购买 nike

我目前无法成功模拟返回 unique_ptr 的接口(interface)。例如,给定

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 , 按照建议 for a similar problem with returned references .

我也试过自己写 ValueWrapper<T>生成一个 unique_ptr,但值总是被复制到某个地方。现在我的想法已经用完了。

最佳答案

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

template <class T>
class TypedReturnValueHolder : public ReturnValueHolder {
public:
virtual T rv() = 0;
};

他们修改了原来的ReturnValueHolder

template <class T>
class ReturnValueWrapper : public ReturnValueHolder {
public:
typename no_cref<T>::type rv;
ReturnValueWrapper(T rv) : rv(rv) {}
};

继承并实现派生接口(interface)。

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 的返回可以写成

        if (call->retVal)
return ((TypedReturnValueHolder<Z> *)call->retVal)->rv();

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

mocks.OnCall( foo, IFoo::foo )
.Do( [](){ return std::unique_ptr<IFoo>(); } );

然后按预期编译和运行。

关于c++ - HippoMocks - 模拟一个返回 unique_ptr 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15160565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com