通常,您定义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信号?
谢谢.
如果你想从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
有关其他信息,请查看以下书籍: