gpt4 book ai didi

c++ - std::reference_wrapper 与 std::shared_ptrs 并行

转载 作者:太空狗 更新时间:2023-10-29 21:45:08 24 4
gpt4 key购买 nike

如果你想绑定(bind)一个函数的引用f , 你可以使用 std::bind(f, std::ref(x)) .在这种情况下 f引用或制作拷贝。

现在我有一个函数 void g(T & t) .我想将输入参数绑定(bind)到 std::shared_ptr<T> mySharedPtr像这样:std::bind(g, mySharedPtr) .这将保证 mySharedPtr的数据的生命周期至少与绑定(bind)一样长。但是因为 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;
}

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

关于c++ - std::reference_wrapper 与 std::shared_ptrs 并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18291724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com