【问题标题】:Parallel of std::reference_wrapper for std::shared_ptrsstd::shared_ptrs 的 std::reference_wrapper 并行
【发布时间】:2013-08-17 17:53:32
【问题描述】:

如果要绑定对函数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 的终身保证。

【问题讨论】:

  • C++11?包装 g 可以吗?
  • 如果我有 lambda,包装 g 肯定会起作用。不幸的是我没有,所以我必须在绑定之前手动包装每个g-like 函数。

标签: c++ shared-ptr stdbind


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 2015-07-27
    • 1970-01-01
    • 2020-12-23
    • 2017-07-31
    • 2017-05-14
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多