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

Phi*_*lip 2 c++ boost

通常,您定义boost::signals2::signal如下:

typedef boost::signals2::signal<void (int)> MySignalType;
MySignalType mySignal;
Run Code Online (Sandbox Code Playgroud)

然后你可以MySignalType::slot_function_type用来获得与那个信号兼容的功能签名.

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

我有现有的代码不使用Boost信号.相反,代码绕过a boost::function并将其调回以"发出信号"某个事件.我想创建一个boost::signals2::signal 在以下方面存在boost::function.我尝试了最直观的组合:

typedef boost::function<void (int)> MyFunctionType;
typedef boost::signals2::signal<MyFunctionType> MySignalType;
Run Code Online (Sandbox Code Playgroud)

但这被编译器拒绝了.如果不可能,我会感到惊讶,因为两者都是Boost包.我最好的猜测是一个boost::function对象(或typedef)有自己的内部typedef,其用途与slot_function_type需要纯函数签名的情况相似,但我在boost :: function文档中找不到这样的东西.

我尝试搜索类似的问答,以及略读Boost文档,并没有找到任何人做同样的事情.

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

谢谢.

Evg*_*yuk 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

很有意思.你能指点我解释一下你的代码做了什么以及你是如何想出来的吗?

get_arg是类模板,它从其参数中提取模板参数(来自get_arg的模板参数).

换句话说,它是元函数 - 它是字面上的函数,它对类型进行操作(而普通函数对值进行操作).

template<template<typename> class Func,typename Sig>
struct get_arg< Func<Sig> >
Run Code Online (Sandbox Code Playgroud)

此语法是get_arg类模板的部分特化

template<typename> class Func
Run Code Online (Sandbox Code Playgroud)

此语法是模板模板参数.

typedef Sig type;
Run Code Online (Sandbox Code Playgroud)

按照惯例,元功能的结果是嵌套的"类型"成员.

用法是:

get_arg< SomeClassTemplate<SomeType> >::type
Run Code Online (Sandbox Code Playgroud)

这导致SomeType

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

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