可以比较两个函子的相等性吗?

时间:2019-04-15 15:01:21

标签: c++ c++11 functor

是否有一种方法可以接收两个仿函数作为参数,以找出它们是否指向同一函数?具体来说,具有这样的结构:

struct FSMAction {
    void action1() const { std::cout << "Action1 called." << std::endl; }
    void action2() const { std::cout << "Action2 called." << std::endl; }
    void action3() const { std::cout << "Action3 called." << std::endl; }

private:
    // Maybe some object-specific stuff.
};

还有这样的方法:

bool actionsEqual(
    const std::function<void(const FSMAction&)>& action1, 
    const std::function<void(const FSMAction&)>& action2)
{
    // Some code.
}

是否存在“代码”仅返回以下内容的true

actionsEqual(&FSMAction::action1, &FSMAction::action1)

但不是:

actionsEqual(&FSMAction::action1, &FSMAction::action2)

也许这个问题没有任何意义(第一个线索可能是互联网上似乎没有关于它的一切……)。如果是这样,您能给个提示吗,为什么?是否有办法完成“相似”的事情? (基本上,我希望在上述意义上有一组仅包含“独特”项目的回调。)

2 个答案:

答案 0 :(得分:3)

原始函数最终是一个指针。您可以在std::function中的dig it out  与std::function::target的比较,那么它只是void*的比较。

答案 1 :(得分:2)

按照迈克尔·查尔达基斯(Michael Chourdakis)的建议直接使用std::function::target<T>()是有问题的,因为要使用它,您必须知道存储在std::function中的实际类型:

  

返回值

     

如果为target_type() == typeid(T),则指向存储函数的指针,否则为空指针。

例如通过使用T = void (A::*)() const,您可以限制自己仅使用void() const的{​​{1}}成员函数。此时,class FSMAction变得比普通成员函数指针更好。


我建议为std::function写一个包装器,该包装器使用类型擦除来实现std::function / ==。这是一个最小的实现:

!=

Try it live