是否有一种方法可以接收两个仿函数作为参数,以找出它们是否指向同一函数?具体来说,具有这样的结构:
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)
也许这个问题没有任何意义(第一个线索可能是互联网上似乎没有关于它的一切……)。如果是这样,您能给个提示吗,为什么?是否有办法完成“相似”的事情? (基本上,我希望在上述意义上有一组仅包含“独特”项目的回调。)
答案 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
/ ==
。这是一个最小的实现:
!=