这个问题严格来说是关于std::function
而不是boost::function
。有关更多详细信息,请参阅此问题底部的更新部分,尤其是关于无法std::function
根据 C++11 标准比较非空对象的部分。
C++11std::function
类模板非常适合维护回调集合。例如,可以将它们存储在 中vector
,并在需要时调用它们。然而,维护这些对象并允许注销似乎是不可能的。
让我具体一点,想象一下这个类:
class Invoker
{
public:
void Register(std::function<void()> f);
void Unregister(std::function<void()> f);
void InvokeAll();
private:
// Some container that holds the function objects passed to Register()
};
示例使用场景:
void foo()
{
}
int main()
{
std::function<void()> f1{foo};
std::function<void()> f2{[] {std::cout << "Hello\n";} };
Invoker inv;
// The easy part
// Register callbacks
inv.Register(f1);
inv.Register(f2);
// Invoke them
inv.InvokeAll();
// The seemingly impossible part. How can Unregister() be implemented to actually
// locate the correct object to unregister (i.e., remove from its container)?
inv.Unregister(f2);
inv.Unregister(f1);
}
很清楚如何Register()
实现该功能。但是,如何实施Unregister()
. 假设保存函数对象的容器是vector<std::function<void()>>
. 您将如何找到传递给Unregister()
调用的特定函数对象?std::function
确实提供了一个重载的operator==
,但它只测试一个空函数对象(即,它不能用于比较两个非空函数对象以查看它们是否都引用相同的实际调用)。
我会很感激任何想法。
更新:
到目前为止的想法主要包括添加一个与每个std::function
可用于注销它的对象相关联的 cookie。std::function
我希望有一些对对象本身来说不是外生的东西。std::function
此外,和之间似乎有很多混淆boost::function
。这个问题严格来说是关于std::function
对象的,而不是 boost::function
关于对象的。
此外,您不能比较两个非空std::function
对象是否相等。根据标准,他们总是会比较不相等。因此,在此问题的上下文中,评论中指向解决方案(并使用boost::function
对象启动)的链接显然是错误的。