2010-09-30 98 views
0

我正在研究一個研究項目的基於事件的體系結構。該系統目前使用Qt信號,但我們試圖擺脫Qt,所以我需要的東西幾乎和Qt事件循環以及線程間的信號一樣。可變參數模板的擴展參數列表

可能違反我的判斷,我選擇使用可變參數模板來創建將用於在目標線程中執行回調的通用事件。

template<typename dest, typename... args> 
class Event { 
    public: 
    Event(dest* d, void(dest::*func)(args...), args... a) 
     : d(d), func(func), pass(a...) { } 

    virtual void perform() { 
     (d->*func)(pass...); 
    } 

    protected: 

    dest* d; 
    void(dest::*func)(args...); 
    args... pass; 
}; 

我還沒有找到任何表明這是否可能的信息。但是,我很難相信它不是。鑑於此,我想知道是否有辦法做這樣的事情,如果沒有,爲什麼?另外,如果有人有更好的方式做到這一點,我會歡迎這個建議。

+0

要回答你的第一個問題,你是否試圖編譯這個? – MSN 2010-09-30 20:35:16

+0

如果你想要的東西與Qt信號非常相似,但是不使用Qt,你可以嘗試[Boost.Signals](http://www.boost.org/doc/libs/1_43_0/doc/html/signals.html)(或者看一下代碼來吸取一些靈感,但是它們還沒有使用C++ 0x)。 – 2010-10-01 06:51:00

+0

是的,我確實試圖編譯這個,唯一讓麻煩的部分是參數...傳遞到底部。 – 2010-10-03 08:08:09

回答

2

嗯。我覺得我有些討厭。代碼不是很漂亮或者不錯,但你可能會明白。您應該能夠使用模板來遞歸地存儲任何類型的對象,並且在調用該函數時通過它們遞歸。

#include <iostream> 

template<typename first_arg, typename... args> 
class Event 
{ 
    public: 

     Event(void (*fn)(first_arg, args...), first_arg first, args... in) : m_func(fn), var(first, in...) {} 

     void operator()() 
     { 
     var(m_func); 
     } 

    private: 
     void (*m_func)(first_arg, args...); 

     template <typename t_arg, typename... t_args> 
     struct storage; 

     template <typename t_arg> 
     struct storage<t_arg> 
     { 
     storage(t_arg t) : m_var(t) {} 

     template<typename t_func, typename... tt_args> 
     void operator()(t_func fn, tt_args... p) 
     { 
      fn(p..., m_var); 
     } 

     t_arg m_var; 
     }; 

     template <typename t_arg, typename t_arg2, typename... t_args> 
     struct storage<t_arg, t_arg2, t_args...> 
     { 
     storage(t_arg t, t_arg2 t2, t_args... p) : m_var(t), m_storage(t2, p...) {} 

     template<typename t_func, typename... tt_args> 
     void operator()(t_func fn, tt_args... p) 
     { 
      m_storage(fn, p..., m_var); 
     } 

     t_arg m_var; 
     storage<t_arg2, t_args...> m_storage; 
     }; 

     storage<first_arg, args...> var; 
}; 

void test(int a, float b) 
{ 
    std::cout << a << std::endl << b << std::endl; 
} 

int main() 
{ 
    Event<int, float> event(test, 10, 100.0); 
    event(); 
} 

另外,我覺得標準::綁定做類似的東西,但不知道:d