c++ - 事件与 boost::function

标签 c++ events boost

<分区>

既然代码胜于 Eloquent ,你会用这个吗:

struct StringEvent
{
    const void* source;
    const std::string str;

    StringEvent(const void* source, const std::string& str)
        : source(source), str(str) 
    { }
};

class StringEventListener
{
public:
    virtual void handler(const StringEvent& event) = 0;
}

class Test : public StringEventListener
{
public:
    void handler(const StringEvent& event) 
    { 
        std::cout << event.str << std::endl; 
    }
}

class EventSource
{
public:
    EventSource(StringEventListener* listener) 
    { 
        listener->handler(StringEvent(this, std::string("foo"))); 
    } 
}

int main()
{
    Test test;

    EventSource(&test);
}

为了这个?

class Test 
{
public:
    void handler(const std::string& str) 
    { 
        std::cout << str << std::endl; 
    }
};

class EventSource
{
public:
    EventSource(const boost::function<void (const std::string&)>& funcPtr)
    {
        funcPtr(std::string("foo"));
    }
};

int main()
{
    Test test;

    EventSource(boost::bind(&Test::handler, &test, _1));
}

让类 EventSource 调用 test.handler("foo")

来自 Java/C# 世界,我发现第一种方法更直观,尽管冗长,但是否推荐在现实生活中使用它,还是它会导致比它的值(value)/性能影响更多的问题?

最佳答案

我绝对不会使用第一个版本。这太可怕了。第二个版本要好得多——它也可以是 lambda 等等。

此外,boost::function 不是函数指针。

关于c++ - 事件与 boost::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901716/

相关文章:

c++ - 如何获取 ICU 中的所有时区名称

javascript - 我无法访问 DOM

c# - 使用新处理程序附加事件处理程序与直接分配它

javascript - 仅将更改应用于具有相同方法名称的多个元素中的单击元素

c++ - boost IPC 等效(qt?)

c++ - 使文件指针读/写到内存中的位置

c++ - 如何从 LPCTSTR 转换为 LPSTR?

c++ - 指向指针的指针

c++ - 如何使用 boost.format 自己输出百分号?

boost - 在 yocto build 中包含特定的头文件