我正在考虑在C++应用程序中实现事件的不同方法.有人建议通过通知中心实施集中的事件调度.另一种方法是将事件的来源和目标直接通信.不过,我对通知中心方法有所保留.我会在我看到它们时概述这两种方法(我很可能会误解它们,我以前从未实现过事件处理).
a)直接沟通.事件是其源接口的一部分.对事件感兴趣的对象必须以某种方式获取源类的实例并订阅其事件:
struct Source
{
Event</*some_args_here*/> InterestingEventA;
Event</*some_other_args_here*/> InterestingEventB;
};
class Target
{
public:
void Subscribe(Source& s)
{
s.InterestingEventA += CreateDelegate(&MyHandlerFunction, this);
}
private:
void MyHandlerFunction(/*args*/) { /*whatever*/ }
};
Run Code Online (Sandbox Code Playgroud)
(根据我的理解,boost :: signals,Qt信号/插槽和.NET事件都是这样的,但我可能是错的.)
b)通知中心.事件在其源代码界面中不可见.所有事件都发送到一些通知中心,可能是作为单身人员实施的(任何关于避免这种情况的建议都会受到赞赏),因为他们被解雇了.目标对象不必知道任何有关源的信息; 他们通过访问通知中心订阅某些事件类型.一旦通知中心收到新事件,它就会通知所有对该特定事件感兴趣的订户.
class NotificationCenter
{
public:
NotificationCenter& Instance();
void Subscribe(IEvent& event, IEventTarget& target);
void Unsubscribe(IEvent& event, IEventTarget& target);
void FireEvent(IEvent& event);
};
class Source
{
void SomePrivateFunc()
{
// ...
InterestingEventA event(/* some args here*/);
NotificationCenter::Instance().FireEvent(event);
// ...
}
};
class Target : public IEventTarget
{
public: …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
std::sort(vec.begin(), vec.end(),
[](const Foo& lhs, const Foo& rhs) { return !(lhs < rhs); }
);
Run Code Online (Sandbox Code Playgroud)
如果lhs == rhs,lambda(lhs,rhs)和lambda(rhs,lhs)都将返回true,这违反了提供严格弱排序的要求.但是,标准是否明确标记将这样的比较器传递为未定义的行为?