Jes*_*eTG 32 c++ function-pointers c++11 std-function
我怎样才能比较两个C++ 11个std::function
s的operator==
,并返回true
如果两个所述function
s请参阅同一个函数指针?
Sha*_*our 18
operator == for std :: function将std :: function与空指针进行比较,据我所知,标准没有提供任何有关原因的详细信息.
虽然,这个提升FAQ条目,为什么我不能比较boost :: function对象与operator ==或operator!=?提供了一个基本原理,据我所知,应该适用于std :: function.引用常见问题解答:
boost :: function对象之间的比较不能"很好"地实现,因此不会实现.[...]
然后概述了类似于Preet的请求解决方案,接着说:
当f和g存储的函数对象的类型没有运算符时会出现问题== [...]
并解释为什么必须在赋值运算符或构造函数中处理它,然后继续说:
所有这些问题都转化为boost :: function构造函数或赋值运算符中的失败,即使用户从不调用operator ==.我们不能对用户这样做.
更新
在访问tr1 :: function对象的目标时找到了一个标准基本原理,这个目标很老但与boost FAQ一致,并说:
operator ==对于C++语言中的tr1 :: function是不可实现的,因为我们没有可靠的方法来检测给定类型T是否是Equality Comparable而没有用户帮助.
P i*_*P i 13
您实际上可以使用它.target
:
template<typename T, typename... U>
size_t getAddress(std::function<T(U...)> f) {
typedef T(fnType)(U...);
fnType ** fnPointer = f.template target<fnType*>();
return (size_t) *fnPointer;
}
if (getAddress(f) == getAddress(g)) {...}
Run Code Online (Sandbox Code Playgroud)
(参考:C++尝试从std :: function获取函数地址)
您可以尝试比较a
,b
首先通过比较它们.target_type()
以及这些目标类型ID是否相同,然后您可以比较它们的.target()
指针.您可以使用不匹配的目标类型作为早期错误.
归档时间: |
|
查看次数: |
17086 次 |
最近记录: |