比较std :: functions是否相等?

Jes*_*eTG 32 c++ function-pointers c++11 std-function

我怎样才能比较两个C++ 11个std::functions的operator==,并返回true如果两个所述functions请参阅同一个函数指针?

Sha*_*our 18

operator == for std :: functionstd :: 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获取函数地址)

  • 这仅在被包装的对象是一个函数指针时才有效,如果它是一个可调用的类或其他几个可以被 `std::function` 包装的东西之一,则它不起作用 (3认同)
  • 实现定义的语义有条件地支持将函数指针转换为“ size_t”。因此,此解决方案可能无法移植。 (2认同)

Pre*_*eti 5

您可以尝试比较a,b首先通过比较它们.target_type()以及这些目标类型ID是否相同,然后您可以比较它们的.target()指针.您可以使用不匹配的目标类型作为早期错误.

  • `target <T>()`需要知道存储的类型,而不仅仅知道它是相同的. (4认同)