通常,您可以像这样定义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信号?
感谢。
答案 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
有关其他信息,请查看以下书籍: