小编use*_*832的帖子

集中事件发送的利弊

我正在考虑在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)

c++ events observer-pattern

5
推荐指数
1
解决办法
1217
查看次数

std :: sort - 传递错误的比较器未定义的行为?

考虑以下代码:

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,这违反了提供严格弱排序的要求.但是,标准是否明确标记将这样的比较器传递为未定义的行为?

c++ stl undefined-behavior

5
推荐指数
1
解决办法
845
查看次数

标签 统计

c++ ×2

events ×1

observer-pattern ×1

stl ×1

undefined-behavior ×1