1

既然代码胜于雄辩,你会用这个:

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# 世界,我发现第一种方法更直观,虽然很冗长,但是否建议在现实生活中使用,还是会导致比其价值/性能损失更多的问题?

4

2 回答 2

1

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

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

于 2012-12-16T13:40:57.230 回答
0

IMO,您可以将“函子”(具有静态方法的对象)与 Boost/C++ 一起使用,而不是完整的对象来保存回调数据和回调对象(在您之前的示例中)。

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

于 2012-12-16T13:38:02.213 回答