std :: reference_wrapper与std :: shared_ptrs的并行

时间:2013-08-17 17:53:32

标签: c++ shared-ptr stdbind

如果要绑定对函数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之前取消引用?如果没有,我可以自己制作吗?

(如果您使用lambdas给出答案,请同时包含一个没有lambdas的答案,因为我的编译器不支持它们。)

修改:std::bind(g, std::ref(*mySharedPtr))不起作用,因为它失去了std::shared_ptr的终身保证。

1 个答案:

答案 0 :(得分: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;
}

最好将转化设为成员模板以允许更多转化。