2012-11-08 48 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

相关问题