如果要绑定对函数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
的终身保证。
答案 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;
}
最好将转化设为成员模板以允许更多转化。