簡體   English   中英

std :: bind和std :: weak_ptr

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM