2013-08-17 82 views
3

如果你要綁定到一個功能f一個參考,你可以使用std::bind(f, std::ref(x))。在這種情況下,f需要參考或複印。並行的std ::對的reference_wrapper的std :: shared_ptrs

現在我有一個功能void g(T & t)。我想將輸入參數綁定到std::shared_ptr<T> mySharedPtr,如下所示:std::bind(g, mySharedPtr)。這將保證mySharedPtr的數據至少和綁定一樣長。但是由於g需要參考,所以這不會進行類型檢查。

有沒有類似於std::ref需要std::shared_ptr並在將它傳遞給g之前將其解除引用?如果不是,我可以自己做一個嗎?

(如果你給使用lambda表達式的答案,請還包括一個沒有lambda表達式,因爲我的編譯器不支持他們。)

編輯:std::bind(g, std::ref(*mySharedPtr))不起作用,因爲它失去了std::shared_ptr的終身保障。

+0

C++ 11?包裹'g'會好嗎? – Yakk

+0

如果我有lambda,包裝'g'肯定會起作用。不幸的是,我不這樣做,所以我必須在綁定每個'g'-like函數之前手動包裝它。 –

回答

2

看來你可以創建一個deref()功能,將創建一個對象非關聯化的東西看起來像在轉換指針:

template <typename P> 
class pointer_wrapper { 
    P ptr; 
public: 
    pointer_wrapper(P p): ptr(p) {} 
    operator decltype(*std::declval<P>())&() { 
     return *ptr; 
    } 
}; 
template <typename P> 
pointer_wrapper<P> deref(P p) { 
    return p; 
} 

這可能是更明智的轉化成員模板,讓幾個轉換。

相關問題