gpt4 book ai didi

C++ lambda 测试拦截器/模拟

转载 作者:行者123 更新时间:2023-11-30 02:21:38 26 4
gpt4 key购买 nike

我正在寻找一种解决方案,如何创建拦截器/模拟 lambda 以便能够检查它是否被调用。我测试的是:

// test.hpp
template<typename R, typename ...Args>
std::function<R(Args&&...)> make_test_lambda(
bool &called,
std::function<R(Args&&...)> fn
) {
called = false;

return [&called, f=std::move(fn)](Args&&... args) {
called = true;
return f(std::forward<Args>(args)...);
};
}

// test.cpp: test with "catch"
bool called;
function_under_test(make_test_lambda(called, [](int x) {
REQUIRE(x == 4);
}));

REQUIRE(called);

它不起作用没有匹配的调用函数。你能帮帮我吗?

非常感谢!

最佳答案

问题是每个 lambda 都有一个只有编译器知道的唯一类型。模板参数推导发生在编译器选择候选函数时,确定可行函数集之前。粗略地说,只有当所有类型都完全匹配时,模板函数才会被包含在候选集中。不允许转换。

在您的情况下,替换您的 std::function<>使用更通用的模板参数 Func 就可以了。像下面的代码:

template<class Func>
struct wrapper
{
wrapper(Func f, bool &called)
: f_(f)
, called_(called)
{}

template<class... Args>
decltype(auto)
operator() (Args&& ...args)
{
called_ = true;
return f_(std::forward<Args>(args)...);
}
private:
Func f_;
bool &called_;
};

template<class Func>
auto
make_test_lambda(bool &called, Func func)
{
called = false;
return wrapper<Func>(func, called);
}

关于C++ lambda 测试拦截器/模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48117248/

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