2

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

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

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

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

我有不使用 Boost 信号的现有代码。取而代之的是,代码绕过 aboost::function并将其调用回“信号”某个事件。我想boost::signals2::signal 根据现有的boost::function. 我尝试了最直观的组合:

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

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

我尝试搜索类似的问答,以及浏览 Boost 文档,但没有发现有人在做同样的事情。

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

谢谢。

4

1 回答 1

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 的模板参数)。

换句话说,它是元函数——它实际上是对类型进行操作的函数(而普通函数对值进行操作)。

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

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

template<typename> class Func

此语法是模板模板参数

typedef Sig type;

按照惯例,元函数的结果是嵌套的“类型”成员。

用法是:

get_arg< SomeClassTemplate<SomeType> >::type

导致SomeType

有关更多信息,请查看以下书籍:

  1. 现代 C++ 设计:应用通用编程和设计模式。安德烈亚历山德雷斯库
  2. C++ 模板元编程:Boost 及其他领域的概念、工具和技术。大卫·亚伯拉罕斯和阿列克谢·古尔托沃伊
于 2012-11-08T23:57:26.403 回答