根据boost :: function定义boost信号?

时间:2012-11-08 23:39:12

标签: c++ boost

通常,您可以像这样定义boost::signals2::signal

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

然后您可以使用MySignalType::slot_function_type来获取与该信号兼容的函数签名。

然而,我正试图做相反的事情。

我现有的代码不使用Boost信号。相反,代码绕过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&amp; A,以及略读Boost文档,但没有找到任何人做同样的事情。

有没有办法根据现有的Boost函数定义Boost信号?

感谢。

1 个答案:

答案 0 :(得分:5)

如果你想从boost :: function中提取签名,那么你可以试试这样的东西:

#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类模板的partial specialization

template<typename> class Func

此语法为template template parameter

typedef Sig type;

按照惯例,元功能的结果是嵌套的&#34;类型&#34;构件。

用法是:

get_arg< SomeClassTemplate<SomeType> >::type

导致 SomeType

有关其他信息,请查看以下书籍:

  1. 现代C ++设计:应用通用编程和设计模式。作者:Andrei Alexandrescu
  2. C ++模板元编程:Boost及其后的概念,工具和技术。作者:David Abrahams和Aleksey Gurtovoy