将std::函数的相等性与存储在其中的lambda进行比较



我使用以下函数来测试std::functions的相等性。该函数的灵感来自这里的SO讨论

template<typename T, typename... U>
inline bool AreEqual(std::function<T(U...)> function_1, std::function<T(U...)> function_2) {
typedef T(fnType)(U...);
fnType ** f_ptr_1 = function_1.template target<fnType*>();
size_t f1 = (size_t) *f_ptr_1;
fnType ** f_ptr_2 = function_2.template target<fnType*>();
size_t f2 = (size_t) *f_ptr_2;
return (f1 == f2);
}

现在如果我有下面的测试来验证它的工作

#include "gtest/gtest.h"
void DummyFunc(bool value) {
value = true;
}
TEST(Some_Test, verify_equality_of_std_functions) {
typedef std::function<void(bool)> FuncType1;
FuncType1 f2 = &DummyFunc;
EXPECT_TRUE(AreEqual(f2, f2));  // This passes as expected
auto test_lambda = [](bool dummy_param) {
dummy_param = true;
};
FuncType1 f1 = test_lambda;
EXPECT_TRUE(AreEqual(f1, f1));  // But, this causes a crash! Why?
}

为什么AreEqual在通过lambda时崩溃?是我对lambda做了什么错事,还是AreEqual缺乏比较存储在std::functions中的lambda的逻辑?

您可以使用以下函数来执行精确操作。

template<class RET, class... Args>
inline bool AreEqual(RET(*f1)(Args&...), RET(*f2)(Args&...))
{
return f1 == f2;
}
TEST(Some_Test, verify_equality_of_std_functions) {
typedef std::function<void(bool)> FuncType1;
FuncType1 f2 = DummyFunc;
EXPECT_TRUE(AreEqual(*f2.target<void(*)()>(), *f2.target<void(*)()>())); 
auto test_lambda = [](bool dummy_param) {
dummy_param = true;
};

/* Lambdas are required to be converted to raw function pointers. */
void(*f1)() = test_lambda;
EXPECT_TRUE(AreEqual(f1, f1));
}

Lambda不是std::function<>s。

最新更新