事件与提升::函数

Events vs boost::function

本文关键字:函数 事件      更新时间:2023-10-16

既然代码比文字更好,你会用这个吗:

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));
}

使类事件源调用test.handler("foo")

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

我绝对不会使用第一个版本。这太可怕了。第二个版本要优越得多 - 它可以是lambdas等等。

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

IMO 您可以使用带有 Boost/C++ 的"函子"(具有静态方法的对象)来保存回调数据和回调对象(在前面的示例中)。

这是一个风格问题,如果你需要对象来传递数据。