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