【发布时间】:2019-04-15 15:01:21
【问题描述】:
有没有办法让接收两个函子作为参数的方法找出它们是否指向同一个函数?具体来说,有一个这样的结构:
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)
也许这个问题没有任何意义(第一个线索是互联网上似乎没有关于它的任何内容......)。如果是这样,您能否给出提示,为什么以及是否有办法完成“类似”的事情? (基本上,我希望有一组只有上述意义上的“独特”项目的回调。)
【问题讨论】:
-
这听起来像是一个 XY 问题。您要解决什么问题才能确保使用相同的功能?
-
你能用成员指针代替
std::function吗? -
这个问题可能会更清楚一点。在标题中您要求比较函子,但问题似乎不是比较两个
Actions,而是找出两个std::functions 是否引用Action的相同方法。您打算如何使用Actions?如果它是一个带有operator()的“普通函子”,您可能只需提供一个Action::operator==并完成它...... -
请注意,判断两个指针是否指向 same 函数与两个指针是否指向执行相同操作的不同函数之间存在差异。前者只是指针比较;后者会更困难。
-
@NathanOliver 也许这是一个 XY 问题......我想允许我的班级的用户(基本上是一个有限状态机)为每个状态分配一个回调,以便在何时触发进入那个状态。如果两个状态的回调相等,我希望它被识别为相同。