1
我想一个通用的boost::function<void(void)>
连接到许多的boost ::不同签名的signals2使用boost :: is_same在C++模板。我能使用Boot ::拉姆达::绑定通过将返回值作为绑定参数的一部分做结合部,但有一个问题,当返回类型为void如何一起的boost ::拉姆达::绑定
例子:
template<typename S>
class signal
{
Connection VoidConnect(boost::function<void(void)> callback)
{
//if(boost::is_same<void, typename S::result_type>::value) // Doesn't seem to work
if (boost::is_void<typename S::result_type>::value) // Doesn't seem to work
{
//GetSignal returns the actual boost signal
// typename 'S' will be a boost::function with the same signature as the signal
return GetSignal().connect(boost::lambda::bind(callback));
}
else
{
typename S::result_type f;
return GetSignal().connect((boost::lambda::bind(callback), f));
}
}
}
我不断收到编译错误
error: variable or field ‘f’ declared void
include/boost/function/function_template.hpp:132:42: error: void value not ignored as it ought to be
由于可以从错误中,如果条件与升压:: is_void可以看出(既不是提高:: is_same)似乎并没有工作,有谁知道是什么原因?有没有更好的方法来做这个绑定?
感谢, 萨克
嗯,感谢您的水溶液和这个模板类信号是具有许多功能一个大班里,如果专门整个模板无效不是一个选项,有没有其他的选择吗?我目前正在寻找boost :: enable_if是否可用于在编译时实现选择。 – Sak 2012-08-07 15:45:37
@Sak,我已经更新了我的答案。 – 2012-08-07 16:42:29
上面的示例工作正常,大多数签名类型的,但是当信号签名包含组合如不能编译:“信号<布尔(浮动),合:: LogicalOrCombiner> SIG3”任何想法,为什么? – Sak 2012-08-13 14:02:34