通过参考识别Lambda

时间:2017-11-23 13:04:56

标签: c++ unit-testing lambda

我想测试一个类函数,它只需要一个std :: function作为参数并将它传递给另一个类。在我的测试中,它被传递给一个模拟对象。

在我的测试文件中,我创建了一个lambda并将其提供给要测试的函数。

现在我的问题是,我如何检查,如果我在模拟对象中收到的lambda仍然像我放弃的那样。是否有办法?

2 个答案:

答案 0 :(得分:0)

所以据我所知,问题在于你无法检查std::function对象是否仍然相同。不幸的是,没有简单的方法。

std :: function中没有相等运算符。可以在旧tr1::function N1667:

中找到基本原理
  

operator==对于C ++语言中的tr1::function是无法实现的,因为我们没有可靠的方法来检测给定类型T是否是没有用户帮助的Equality Comparable

一种方式(您已经知道)是通过引用传递函数对象并比较地址。这不是一个好的解决方案,因为函数对象很容易复制。

另一个解决方案是将函数对象包装在另一个存储函数的对象中,并为其分配一个id。

以下内容: Using shared_ptr for unique ownership (kind of) - is this good practice?

您的'包装器对象'可以从HandleBased和std::function继承。这样您就可以简单地比较键。

希望我能帮忙......

答案 1 :(得分:0)

如何查看typeid

#include <functional>
#include <iostream>
#include <typeinfo>
#include <iomanip>

std::function<void()> foo(std::function<void()> x){
    return x;
}

std::function<void()> bar(std::function<void()>){
    return []{};
}

int main(){
    int x = 5;
    auto l = [x](){return x;};
    std::cout << std::boolalpha;
    std::cout << (foo(l).target_type()==typeid(l)) <<' ';
    std::cout << (bar(l).target_type()==typeid(l));
}