C++ lambda 测试拦截器/模拟
C++ lambda testing interceptor/mock
我正在寻找一种解决方案,如何创建拦截器/模拟 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);
它不起作用no matching function for call
.你可以帮我吗?
谢谢!
问题是每个 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);
}
相关文章:
- 如何使用Google Mock来模拟gettimeofday()
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- G锁定铸造到基础上会释放模拟行为
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 落砂模拟碰撞检测C++和SFML
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 模拟成员函数调用 lambda
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- C++ lambda 测试拦截器/模拟
- 模拟 C++ 中 lambda 的复制赋值运算符
- 在基于 lambda 的 foreach 循环中模拟 'continue;', 'break;“