2012-04-21 60 views
1

我有這樣的代碼:仿函數+成員指針來創建對象的信號

// signal supporter parent 
class signalable {}; 

template <class typeT = signalable> 
typedef void (typeT::*trig)(std::string); 

template <class typeT = signalable> 
class trigger 
{ 
    private: 
     typeT* instance; 
     typeT::trig fun; 

    public: 
     trigger(typeT* inst, typeT::trig function) 
      : instance(inst), fun(function) 
     {} 
     void operator()(std::string param) 
     { 
      (instance->*fun)(param); 
     } 
}; 

我得到許多編譯錯誤的,我敢打賭,專家們都知道的。我只是對這個背景感到困惑。

我想做的事情很清楚:將指針指向一個對象,並指向其中一個成員函數,以製作一個函數並在程序中傳遞它。

希望你的幫助和「更正」。

謝謝!

+2

本Ç回答了你的問題,但你可能想看看進入[觀察者模式(http://en.wikipedia.org/ wiki/Observer_pattern)爲我認爲是你的**原始**問題的一個很好的方法。 – smocking 2012-04-21 11:42:49

+0

@smocking我很欣賞你的觀點,這是我之前處理過的一個案例,但在這種情況下,觀察者模式是我的目標,因爲在我的代碼事件中,要以「鏈式」方式傳播,而不是傳播到多個事件被調用者。無論如何,感謝幫助我觀察對比。 – Haix64 2012-04-21 12:01:40

+0

我不確定我是否理解爲什麼你會想要這種信號,但是你不能通過讓你的「鏈式」信號類繼承Observer和Observable接口來擴展一些模式嗎? – smocking 2012-04-21 12:43:42

回答

0

你想要做這樣的事嗎?

#include <string> 
#include <iostream> 

// signal supporter parent 
class signalable 
{ 
public: 
    void foo(std::string s) { std::cout << "hello: " << s << std::endl; } 
}; 


template <class typeT = signalable> 
class trigger 
{ 

    typedef void (typeT::*trig)(std::string); 

    private: 
     typeT* instance; 
     trig fun; 

    public: 
     trigger(typeT* inst, trig function) 
      : instance(inst), fun(function) 
     {} 
     void operator()(std::string param) 
     { 
      (instance->*fun)(param); 
     } 
}; 

int main() 
{ 
    signalable s; 
    trigger<> t(&s, &signalable::foo); 
    t("world"); 
} 

至於一些在你的代碼更具體的錯誤,其中大部分似乎都與你的typedef。 C++ 11允許「模板類型定義」,但它們看起來不是那樣。看看這個線程模板類型定義的例子:

C++ template typedef

+0

你的代碼是正確的。只需將'fun'和構造函數的'typeT :: trig'改爲'trig'即可解決它。謝謝。 – Haix64 2012-04-21 11:36:40