Parallel of std::reference_wrapper for std::shared_ptrs

Parallel of std::reference_wrapper for std::shared_ptrs

本文关键字:std ptrs shared for reference of Parallel wrapper      更新时间:2023-10-16

如果要将引用绑定到函数f,可以使用std::bind(f, std::ref(x))。在这种情况下,f获取引用或进行复制。

现在我有一个函数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的寿命保证。

您似乎可以创建一个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;
}

最好将转换作为成员模板,以允许更多的转换。