2012-11-08 46 views
2

通常情況下,你定義一個boost::signals2::signal像這樣:根據boost :: function定義boost信號?

typedef boost::signals2::signal<void (int)> MySignalType; 
MySignalType mySignal; 

,然後你可以使用MySignalType::slot_function_type以獲取與信號兼容功能簽名。

但是,我試圖做相反的事情。

我有現有的代碼,不使用升壓信號。相反,代碼繞過boost::function傳遞,並將其返回給「發送」某個事件。我想根據創建一個boost::signals2::signal現有的boost::function。我嘗試了最直觀的組合:

typedef boost::function<void (int)> MyFunctionType; 
typedef boost::signals2::signal<MyFunctionType> MySignalType; 

但是,這被編譯器拒絕。如果這是不可能的,我會感到驚訝,因爲兩者都是Boost軟件包。我最好的猜測是boost::function對象(或typedef)有其自己的內部typedef,與slot_function_type相似,可用於需要純函數簽名的地方,但我在boost::function documentation中找不到類似內容。

我試過尋找類似的Q & A,以及瀏覽Boost文檔,還沒有發現有人在做同樣的事情。

有沒有方法根據現有的Boost函數定義Boost信號?

謝謝。

+0

您的上一個代碼塊至少缺少'>'。 –

+0

謝謝。固定。我重新輸入了這個問題的代碼,所以這不是原始問題的原因。 – Philip

+0

不幸的是,我們無法知道您在其他地方沒有犯過類似的錯誤。請張貼你的測試用例_verbatim_。 –

回答

5

如果你想提取升壓簽名::功能,那麼你可以嘗試這樣的事:

#include <boost/signals2.hpp> 
#include <boost/function.hpp> 
#include <iostream> 
#include <ostream> 

using namespace boost; 
using namespace std; 

template<typename T> 
struct get_arg; 

template<template<typename> class Func,typename Sig> 
struct get_arg< Func<Sig> > 
{ 
    typedef Sig type; 
}; 

int main() 
{ 
    typedef boost::function<void()> F; 
    signals2::signal< get_arg<F>::type > signal; 
} 

編輯:

非常有趣。你能否指點我的某個地方,解釋你的代碼的作用以及你如何提出它?

get_arg是類模板,它從參數(從get_arg的模板參數)中提取模板參數。

換句話說,它是Metafunction - 它實際上是對類型進行操作的函數(而普通函數對值進行操作)。

template<template<typename> class Func,typename Sig> 
struct get_arg< Func<Sig> > 

這句法是get_arg類模板

template<typename> class Func 

這句法是template template parameterpartial specialization

typedef Sig type; 

按照慣例,Metafunction的結果是嵌套的「type」成員。

用法爲:

get_arg< SomeClassTemplate<SomeType> >::type 

導致SOMETYPE

有關更多信息,請查看以下書籍:

  1. 現代C++設計:泛型編程與設計中的應用模式。作者:Andrei Alexandrescu
  2. C++模板元編程:Boost和Beyond的概念,工具和技術。通過David Abrahams和Aleksey Gurtovoy
+0

非常有趣。你能否指點我的某個地方,解釋你的代碼的作用以及你如何提出它? – Philip

相關問題