如何比较 std::function 个对象?
How can I compare std::function objects?
我有一个包含 std::function
个对象的向量,定义如下:
std::vector<std::function<void()>> funcs = { myFunc1, myFunc2, myFunc3 };
//The functions are defined like this:
//void myFunc1() { ... }
我正在尝试在这个数组中搜索特定函数。我的第一次尝试是使用 std::find
函数,如下所示:
auto iter = std::find(funcs.begin(), funcs.end(), myFunc2);
//CS2679: binary '==': no operator found which takes a right-hand operator of type '_Ty (__cdecl &)' or there is no acceptable conversion
我通过艰难的方式了解到 std::function::operator==()
不会比较相等,除非函数对象为空(显然不是这种情况)。所以我尝试使用 std::find_if
来利用 std::function::target()
方法:
auto iter = std::find_if(funcs.begin(), funcs.end(), [](const std::function<void()>& f)
{
if (*f.target<void()>() == myFunc2)
//using or not using that '*' before f in the condition makes no difference in the error
return true;
return false;
});
我的编译器(VC++ 2019)仍然抱怨同样的错误。出于好奇,我尝试手动编写一个 find
函数来查看发生了什么,但我没有成功,得到了同样的错误:
auto iter = funcs.begin();
for (; iter != funcs.end(); iter++)
if (*iter->target<void()>() == myFunc2)
break;
所以问题来了。我如何比较 2 std::function
个对象以查看它们是否存储相同的函数?
如here所示,模板成员函数target
接受与存储对象类型进行比较的类型。在您的情况下,它是 指向函数的指针 。你必须改变
*iter->target<void()>() == myFunc2
到
*iter->target<void(*)()>() == myFunc2
请注意,这只会让您找到普通的 C 函数,而不是任意可调用对象(如 lambda 函数)。我认为你应该考虑在这里使用普通指针而不是 std::function
。
我有一个包含 std::function
个对象的向量,定义如下:
std::vector<std::function<void()>> funcs = { myFunc1, myFunc2, myFunc3 };
//The functions are defined like this:
//void myFunc1() { ... }
我正在尝试在这个数组中搜索特定函数。我的第一次尝试是使用 std::find
函数,如下所示:
auto iter = std::find(funcs.begin(), funcs.end(), myFunc2);
//CS2679: binary '==': no operator found which takes a right-hand operator of type '_Ty (__cdecl &)' or there is no acceptable conversion
我通过艰难的方式了解到 std::function::operator==()
不会比较相等,除非函数对象为空(显然不是这种情况)。所以我尝试使用 std::find_if
来利用 std::function::target()
方法:
auto iter = std::find_if(funcs.begin(), funcs.end(), [](const std::function<void()>& f)
{
if (*f.target<void()>() == myFunc2)
//using or not using that '*' before f in the condition makes no difference in the error
return true;
return false;
});
我的编译器(VC++ 2019)仍然抱怨同样的错误。出于好奇,我尝试手动编写一个 find
函数来查看发生了什么,但我没有成功,得到了同样的错误:
auto iter = funcs.begin();
for (; iter != funcs.end(); iter++)
if (*iter->target<void()>() == myFunc2)
break;
所以问题来了。我如何比较 2 std::function
个对象以查看它们是否存储相同的函数?
如here所示,模板成员函数target
接受与存储对象类型进行比较的类型。在您的情况下,它是 指向函数的指针 。你必须改变
*iter->target<void()>() == myFunc2
到
*iter->target<void(*)()>() == myFunc2
请注意,这只会让您找到普通的 C 函数,而不是任意可调用对象(如 lambda 函数)。我认为你应该考虑在这里使用普通指针而不是 std::function
。