[英]std::bind and std::weak_ptr
我有一個創建包裝函子以處理對象的weak_ptr的類。 當仿函數執行時,它將在調用對象仿函數之前測試weak_ptr。
此外,如果對象不再存在,包裝函子可以返回默認值。
這是根據GCC 4.4.7編譯的類的摘錄...
class Bind
{
public:
// non-void weak-functor
template <typename R>
struct Wrapper<R, typename std::enable_if<!std::is_void<R>::value>::type>
{
using result_type = R;
template <typename O>
R operator()(const std::weak_ptr<O> && obj,
std::function<R()> && func, R && ret)
{
if (auto ptr = obj.lock())
{
return func();
}
return std::forward<R>(ret);
}
};
// weak from shared - non-void return
template <typename R, typename F, typename O, typename... A>
static std::function<R()> Weak(R && ret,
F func,
const std::shared_ptr<O> && obj,
A&&... args)
{
return std::bind(Wrapper<R>(),
std::weak_ptr<O>(obj),
std::function<R()>(std::bind(func, obj.get(),
std::forward<A>(args)...)),
ret);
}
// ...
};
該類可以這樣使用...
auto x = std::make_shared<X>();
auto f = Bind::Weak(false, &X::foo, x, 1, 2, 3);
f(); // returns x::foo(1, 2, 3)
x.reset()
f(); // returns false
不幸的是,將編譯器升級到GCC 4.8.3后,它不再編譯。 錯誤開始是這樣的...
error: could not convert 'std::bind(_Func&&, _BoundArgs&& ...)
...通常使用模板模板 最主要的原因是它無法再將Bind :: Weak()中std :: bind()的結果轉換為Bind :: Weak()的返回類型。
我已經弄弄了幾個小時,但仍無法解決問題。
問題是您不能使用std::function
進行完美的轉發,因為std::function
必須可復制,因此綁定值也必須可復制。
將operator()
原型更改為:
template<typename O>
R operator()(const std::weak_ptr<O>& obj, const std::function<R()>& func, const R& ret)
{
//...
}
應該或多或少足以完成這項工作(由於發布的代碼不完整,因此很難確定)。
但是,既然您到綁定的轉發已被破壞,那么所有這些std::forward
和&&
都沒有多大意義,IMO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.