2012-12-16 59 views
1

由於代碼比語言更好,你這樣做:活動VS升壓::功能

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#世界,我發現第一種方法更直觀,雖然冗長,但它是否被重新調用用於現實生活中,還是會導致更多問題而不是價值/性能命中?

回答

1

我絕對不會使用第一個版本。這太可怕了。第二個版本遠遠優越 - 它可以是lambda表達式,也可以是lambda表達式。

另外,boost::function不是函數指針。

+0

+1 - 爲了一個毫不猶豫的答案,我同意) – SChepurin

+2

請你詳細說明爲什麼第一種方法會很糟糕? – silverhx

+1

你正在浪費你的生命,定義一個無窮無盡的新班級*,這些班級都做同樣的事情*。相反,你可以不定義一個類,並使用lambda。 – Puppy

0

IMO你可以使用Boost/C++的'functors'(具有靜態方法的對象),而不是全部吹起的對象來保存回調數據和一個回調對象(在你之前的例子中)。

這是一個風格問題,如果你需要對象來傳遞數據。

+1

函子不是靜態方法的對象。函子是帶有operator()的對象。 – Puppy

+0

我可以在哪裏瞭解更多關於Functor的定義? – Arcturus

+0

http://codepuppy.co.uk/cpptuts/Stdlib/Functors.aspx – Puppy